MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要

MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要

序文

MySQL では、複数テーブル結合クエリは非常に一般的な要件です。複数テーブルクエリを使用する場合、複数のテーブルから使用したり、結合を使用して複数のテーブルに接続したりできます。

これら 2 つのクエリの違いは何でしょうか? どちらのクエリの方が効率的でしょうか? これらの疑問から、試してみることにしました。

1. まずローカルのMySQLにテーブル1と2を作成します

1つのテーブル

テーブル `one` を作成します (
 `id` int(0) NOT NULL AUTO_INCREMENT,
 `one` varchar(100) NOT NULL,
 主キー (`id`)
)エンジン = InnoDB 文字セット = utf8;

2つのテーブル

テーブル `two` を作成します (
 `id` int(0) NOT NULL AUTO_INCREMENT,
 `two` varchar(100) NOT NULL,
 主キー (`id`)
)エンジン = InnoDB 文字セット = utf8;

まず、いくつかのデータを挿入して確認します。

one.id=two.id の場合、one、two から one.id、one.one、two.id、two.two を選択します。 

one から one.id、one.one、two.id、two.two を選択し、one.id=two.id で 2 つを結合します。 

2 つのクエリを比較すると、クエリ時間にほとんど違いはありません。SQL 実行分析を確認しても違いはありません。

2 つのクエリのパフォーマンスの違いを強調するために、テーブル 1 に 100 万件のレコードを挿入し、テーブル 2 に 10 万件のレコードを挿入します。大量のデータがあると、わずかな違いも際限なく拡大されます。それでは、違いを比較してみましょう。

まず、Pythonを使ってデータベースにデータを挿入します。なぜPythonを使うのか?Pythonはシンプルなコードを書くからです。

コードについて

pymysqlをインポートする

db = pymysql.connect("127.0.0.1", 'root', "123456", "bruce")
カーソル = db.cursor()

sql = "1つの値(%s)にINSERT INTO"
iが範囲(1000000)内にある場合:
 カーソル.executemany(sql、['one' + str(i)])
 i % 10000 == 0 の場合:
 コミット()
 print(str(i) + 'コミット')
コミット()

print('挿入OK')
sql2 = "2つの値(%s)にINSERT INTO"
iが範囲(100000)内にある場合:
 カーソル.executemany(sql2, ['two' + str(i)])
 i % 10000 == 0 の場合:
 コミット()
 print(str(i) + 'コミット')
コミット()
print('2つ挿入OK')

挿入にはしばらく時間がかかりますので、しばらくお待ちください。

データが挿入されたら、クエリしてみましょう

まず2つのテーブルからクエリを実行します

one.id=two.id の場合、one、two から one.id、one.one、two.id、two.two を選択します。 

約20.49秒かかります。

JOINクエリをもう一度使ってみましょう

one から one.id、one.one、two.id、two.two を選択し、one.id=two.id で 2 つを結合します。 

19.45秒かかりました。10万件のデータの中で、1秒の誤差は大した問題ではありません。

条件制約としてIDを使用する場合のクエリを見てみましょう

クエリ時間には違いはありません。SQL実行分析を見てみましょう。

結果は同じだ

要約する

MySQL では、FROM を使用して複数のテーブルをクエリする場合と、JOIN 接続 (LEFT JOIN と RIGHT JOIN を除く) を使用する場合のクエリ結果とクエリ効率は同じです。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

以下もご興味があるかもしれません:
  • MYSQLは内部結合を使用して例をクエリ/削除/変更します
  • MySQL クエリの最適化: 結合クエリのソート制限の概要 (結合、順序、制限ステートメント)
  • MySQL の最適化: サブクエリの代わりに結合を使用する
  • MySQL の複数の左結合クエリの使用状況の分析
  • MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法
  • MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要
  • プロファイルを使用して遅い SQL を分析する MySQL の詳細な説明 (グループ左結合はサブクエリよりも効率的です)
  • MySQL 結合クエリの原則の知識ポイント
  • MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴
  • MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)

<<:  CentOS6.5 でファイル共有サービス Samba を構築するチュートリアル

>>:  React Native APPのアップデートに関する簡単な説明

推薦する

JS初心者が配列を処理するための実践的な方法のまとめ

join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...

近々ブラウザに導入される CSS :is() と :where() の簡単な分析

Safari (Technology Preview 106) および Firefox (バージョン...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

Docker の win ping 失敗コンテナ回避ガイド

win docker-desktopを使ってコンテナ開発に接続し、ネットワーク上で色々試してみたいと...

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

vue.config.js からプロジェクト最適化までの vue2.x 構成

目次序文vue.config.js 構成オプションパッケージサイズを縮小するためのパッケージの最適化...

Linux で ARM 開発ボード用のファイルシステムを作成する

1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

目次序文1. 概要2. 読み取りと書き込みの分離3. MySQL マスタースレーブレプリケーションの...

Linux オペレーティング システムの概要と紹介

目次1. オペレーティングシステムとは何か2. Linuxの起源3. Linuxの基本機能4. Li...

JavaScript の基礎: 即時実行関数

目次関数フォーマットを即時実行関数を即座に実行する他の方法 – 式即時実行される関数はパラメータを取...

プロジェクトの再構築からプロジェクトにおける CSS3 カスタム変数の使用について話す

CSS3変数について変数を宣言するときは、変数名の前に 2 つのハイフン ( -- ) を追加します...

Ubuntu16.04 インストール mysql5.7.22 グラフィックチュートリアル

VMware12.0+Ubuntu16.04+MySQL5.7.22 インストールチュートリアルの詳...

HTML ページ スタイルの !-- -- の機能は何ですか?

主に低バージョンのブラウザ向け<!-- --> は HTML コメント タグです。上位バ...

Alibaba Cloud Nginx はドメイン名アクセス プロジェクトを実装するために https を設定します (グラフィック チュートリアル)

ステップ1: サードパーティの信頼できるSSL証明書に署名するAlibaba Cloud で直接、無...

MySQLの行数カウントに関する簡単な説明

各テーブルの行数をカウントするために使用される MySQL count() 関数は、誰もがよく知って...