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

推薦する

ウェブページからテキスト透かしを削除する2つの簡単な方法

<br /> 特定の Web サイトを閲覧して、優れた Web ページを見つけた場合、そ...

RGBAアルファ透明度変換計算表

IEでのRGBAとフィルター値の変換RGBA 透明度値IE フィルター値0.1 19 0.2 33 ...

React useMemo と useCallback の使用シナリオ

目次メモを使うコールバックの使用メモを使う親コンポーネントが再レンダリングされると、そのすべての要素...

ウィンドウとLinuxプロジェクトを展開する際のLinuxファイルパスに問題はありません

長い間ブログを書いていませんでした。先週、プロジェクトをテストしたところ、いくつかのバグが見つかりま...

CSS3は円錐グラデーション効果を実現します

文法:背景画像: 円錐グラデーション(位置の角度から、開始色、...、最後の色)最初のパラメータ:開...

Windows 10 でカスタムドメイン名をバインドするように Hexo と GitHub を構成する方法

Hexo は Windows 10 でカスタムドメイン名を GitHub にバインドしますまずドメイ...

docker compose の記述ルールについての簡単な説明

この記事ではクラスタの展開に関連する内容は紹介しませんバージョン制約Docker エンジン >...

MySQLのイベントスケジューラEVENTを理解する

MySQL のイベント スケジューラ EVENT は、Unix crontab や Windows ...

MySQL 完全崩壊: クエリフィルタ条件の詳細な説明

概要実際のビジネス シナリオ アプリケーションでは、ビジネス条件に基づいて対象データを取得およびフィ...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策

Vue ルーティング this.route.push ジャンプ ページが更新されない1. 背景概要:...

MySQLのslave_exec_modeパラメータの詳細な説明

今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...

CSS3は光る境界線効果を実現します

操作効果: html <!-- この要素は表示されません。DOM は JavaScript に...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...