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

推薦する

Linux の traceroute コマンドの使用方法の詳細な説明

Traceroute を使用すると、情報がコンピュータからインターネットの反対側のホストまでたどるパ...

Jenkins の Docker のデプロイとインストール手順

まず、Docker がインストールされたサーバーが必要です。 (私はすでにこれをサーバーにインストー...

DIV と画像の水平および垂直の中央揃えは複数のブラウザと互換性があります

最初のタイプ: 完全な CSS コントロール、レイヤーフローティング (ログインページに適しています...

Dockerの動作モードと原理の詳細な説明

次の図に示すように: 仮想マシンと Docker を使用するとき、「なぜ Docker は VM よ...

MySQLステートメントの記述と実行順序を理解するだけです

MySQL ステートメントの書き込み順序と実行順序には大きな違いがあります。書き順、mysql の一...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows)

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカ...

数百万のデータボリュームに対する MySQL ページングクエリ方法とその最適化の提案

データベース SQL の最適化はよくある問題です。何百万ものデータ ボリュームに対してページング ク...

CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します

1. CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します1. 一般的なスタ...

HTML でのテキストエリアの使用と一般的な問題およびケース分析

textarea タグはよく使われる HTML タグです。主に長いテキストを入力するときに改行するた...

HTML ページに SVG を挿入する複数の方法

SVG (Scalable Vector Graphics)は、XML 構文に基づいた画像形式です。...

Vuex データの永続性を実装するためのアイデアとコード

vuexとはvuex: vue.js専用に開発された状態管理ツールで、すべてのコンポーネントの状態を...

React Native スキャフォールディングの基本的な使い方の詳細な説明

プロジェクトを構築する対応するパスでコマンドラインを実行します: react-native init...

Linux inotifyリアルタイムバックアップの実装方法の詳細説明

リアルタイム レプリケーションは、企業データをバックアップする最も重要な方法です。主に、ユーザーが送...

dockerコンテナは直接実行され、pingを介してパブリックIP操作を取得します。

コンテナを通じてローカル パブリック IP アドレスを取得します。ローカル IP アドレスを使用して...

JS の toFixed() メソッドの丸め精度の問題の詳細な説明

目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...