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 5.7 zip アーカイブ バージョンのインストール チュートリアル

この記事では、MySQL 5.7 zipアーカイブ版のインストールチュートリアルを参考までに紹介しま...

JavaScript キャンバスで動的な点と線の効果を実現

この記事では、動的な点と線の効果を実現するためのJavaScriptキャンバスの具体的なコードを参考...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

ホワイトボードを踏まないようにするゲームを実装するための HTML+CSS+JS

目次背景1. 思考分析2. ページ構成2.1 HTML レイヤー2.2 CSS レイヤー2.3 JS...

mysql5.7.18 解凍バージョンで mysql サービスを起動します

mysql5.7.18の解凍版はmysqlサービスを起動します。具体的な内容は以下のとおりです。 1...

LinuxでのMySQLのインストール手順

1. mysql tar ファイルをダウンロードします。参考: 2. インストールパッケージがあるデ...

forループ内のvarの問題の解決

序文var は ES5 における変数宣言方法です。var で変数を宣言するとループ変数がグローバル変...

MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

以前、あるプロジェクトでMysql FIND_IN_SET関数を使用したことがありますが、非常に便利...

Vueはコードのハイライトを実現するためにモナコを使用しています

Vue 言語と要素コンポーネントを使用して、コード コンテンツの入力を必要とし、ハイライト表示が可能...

CSS を使用して fullpage.js のフルスクリーン スクロール効果を実装するサンプル コード

最近 CSS を勉強していたとき、 2 つの CSS プロパティだけを使用して全画面スクロール効果を...

JavaScriptはオブジェクトの不要なプロパティを削除します

目次例方法1: 削除方法2: 分解補充する要約するThinking シリーズは、10 分で実用的なプ...

Vue ドラッグ アンド ドロップのシンプルな実装

この記事では、主に次のような Vue ドラッグ アンド ドロップの簡単な実装を紹介します。レンダリン...

Vue3の状態管理の使用方法の詳細な説明

目次背景提供/注入共有状態の抽出データを提供するデータの挿入まとめ反応的な共有状態の抽出共有状態の使...