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のアップデートに関する簡単な説明

推薦する

MySQLサーバーは--read-onlyオプションで実行されているため、このステートメントを実行できません

会議中に同僚から開発ライブラリを書き込めないとの報告を受けました。エラー メッセージは次のとおりでし...

JavaScriptはマウスの動きに追従するボックスを実装します

この記事では、マウスの動きを追跡するためのJavaScriptの具体的なコードを参考までに紹介します...

jQuery ツリービュー ツリー構造アプリケーション

この記事では、jQueryツリービューツリー構造のアプリケーションコードを例として紹介します。具体的...

Chrome デベロッパー ツールの詳細な紹介 - タイムライン

1. 概要ユーザーは、アクセスする Web アプリケーションがインタラクティブでスムーズに実行される...

Mysql: 定義者として指定されたユーザー ('xxx@'%') が存在しません 解決策

本日のプロジェクト最適化中に、MySQL に問題が発生しました: 定義者として指定されたユーザー (...

Docker で LNMP 環境を素早く構築する方法 (最新)

序文ヒント: ここで、この記事に記録するおおよその内容を追加できます。例えば、人工知能の継続的な発展...

Linux サーバーでの MySQL インストール情報の表示

mysql のインストール情報を表示します。 #ps -ef | grep mysql usr/bi...

MySQL インデックス プッシュダウン (ICP) の簡単な理解と例

序文Index Condition Pushdown (ICP) は、MySQL 5.6 の新機能で...

mysqlは、現在の時刻が開始時刻と終了時刻の間にあるかどうかを判断し、開始時刻と終了時刻が空であることが許可されます。

目次要件: 進行中のアクティビティ データを照会する次のSQLクエリは、上記の4つの要件を満たし、タ...

HTML 選択オプション デフォルトの選択方法

オプションに属性 selected = "selected" を追加すると、それ...

MySQL 文字列連結関数 GROUP_CONCAT の詳細な説明

前回の記事では、クロステーブル更新について書きました。自分が書いた SQL を見たとき、自分がバカみ...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...

Docker+Jenkinsを使用して自動的にビルドおよびデプロイする

この記事では、Docker+Jenkins の自動ビルドデプロイメントを紹介し、皆さんと共有します。...

win10でのmysql5.7.21解凍バージョンのインストールチュートリアル

次のように、Win10でMysqlの解凍バージョンをインストールします。環境: win10 64ビッ...