序文 インターネット上には、MySQL でインデックスにヒットできないさまざまな状況をまとめた記事がよくあります。その 1 つは、またはを使用するステートメントがインデックスにヒットできないというものです。 この記述は実際には正しくありません。正しい結論は、MySQL 5.0 以降では、またはで接続されたフィールドに独立したインデックスがある場合、そのインデックスにヒットできるということです。ここで、index_merge 機能が使用されます。 MySQL 5.0 より前では、SQL ステートメントは 1 つのインデックスしか使用できません。SQL ステートメントで or キーワードを使用すると、既存のインデックスは無効になり、テーブル全体のスキャンが実行されます。どのインデックスを使用しても、MySQL は条件を満たすデータを一度に見つけることができないため、インデックスを放棄することしかできません。 MySQL も継続的にアップグレードおよび更新されており、MySQL バージョン 5.0 以降では index_merge インデックス マージ機能が追加され、1 つの SQL で複数のインデックスを使用することも可能になりました。 index_merge の基本的な考え方は、まず単一のインデックスを使用して要件を満たすデータを見つけ、次にそれらのデータを結合して返すことです。 ここでも前回の記事で作成したテーブルとテストデータを使用します。10w のテストデータがテーブルに挿入されます。テーブル構造は次のとおりです。 テーブル `t` を作成します ( `id` int(11) NULLではない、 `a` int(11) デフォルト NULL, `b` int(11) デフォルト NULL, 主キー (`id`) )ENGINE=InnoDB; まず a フィールドにインデックスを追加し、次に または を使用してクエリ ステートメントを実行して、それがどのように機能するかを確認しましょう。 mysql> テーブル t を変更し、インデックス a_index(a) を追加します。 クエリは正常、影響を受けた行は 0 行 (0.17 秒) レコード: 0 重複: 0 警告: 0 mysql> explain select a from t where a=100 or b=6000; +----+-------------+-------+-------+---------------+-------+--------+---------+------------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+--------+---------+------------+------------+ | 1 | SIMPLE | t | ALL | a_index | NULL | NULL | NULL | 100332 | where の使用 | +----+-------------+-------+-------+---------------+-------+--------+---------+------------+------------+ セット内の 1 行 (0.00 秒) フィールド b にはインデックスがないため、MySQL はテーブルを返すプロセスを回避できるため、完全なテーブル スキャンの方がコストがかからないと判断します。 次に、フィールド b にインデックスを追加して、SQL ステートメントを再度実行します。 mysql> テーブル t を変更し、インデックス b_index(b) を追加します。 クエリは正常、影響を受けた行は 0 行 (0.17 秒) レコード: 0 重複: 0 警告: 0 mysql> explain select a from t where a=100 or b=6000; +----+-------------+-------------+------------+-----------------+--------+------+------+-------------------------------------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------------+------------+-----------------+--------+------+------+-------------------------------------------+ | 1 | SIMPLE | t | index_merge | a_index,b_index | a_index,b_index | 5,5 | NULL | 2 | union(a_index,b_index); を使用する where を使用する | +----+-------------+-------------+------------+-----------------+--------+------+------+-------------------------------------------+ セット内の 1 行 (0.00 秒) 今回は、MySQL がインデックス a と b の両方を使用し、type フィールドの値が index_merge であることがわかります。 次に、別の SQL ステートメントを見て、結果がどうなるかを確認してみましょう。 mysql> explain select a from t where a>100 or b>6000; +----+-------------+-------+-------+-----------------+-------+--------+--------+-----------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+-----------------+-------+--------+--------+-----------+------------+ | 1 | SIMPLE | t | ALL | a_index,b_index | NULL | NULL | NULL | 100332 | where の使用 | +----+-------------+-------+-------+-----------------+-------+--------+--------+-----------+------------+ セット内の 1 行 (0.00 秒) この SQL 文は、等号を大なり記号に変更するだけなので、返される結果セットは間隔セットになります。MySQL はここでインデックスを放棄し、テーブル全体のスキャンを実行します。ただし、いくつかの記事で、この問題は MySQL バージョン 5.7 以降で最適化されている、つまり、間隔クエリでも index_merge がサポートされていると読みました。私のバージョンは 5.6 で、この最適化はまだ検証していません。興味があれば、検証してみてください。 実際、MySQL には絶対的なことがたくさんあります。MySQL のバージョンが異なれば、同じ SQL に対しても内部処理方法が異なる場合があります。同時に、MySQL は継続的に最適化およびアップグレードされており、古い知識ポイントの一部は簡単に適用できなくなることがわかります。 この記事が皆さんのお役に立てば幸いです。フォローして「いいね!」していただければ、私にとって最高のサポートになります。ありがとうございます。 また、MySQL の基盤となるデータ構造については、私が以前に書いた他の記事を参照すると、この記事の理解に役立つかもしれません。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: CentOS7 は Docker のバージョン 19 をデプロイします (簡単なので、従ってください)
多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...
1. 需要バックエンドは、フロントエンドがツリー構造(重複データなし)に変換するためのデータを提供し...
MySQL 8.0.3がリリースされます。新機能を見てみましょうMySQL 8.0.3 は RC ...
この記事の例では、参考のためにjsカスタム右クリックメニューの具体的なコードを共有しています。具体的...
前の章では、高性能な MySQL に不可欠な、最適化されたデータ型の選択方法とインデックスの効率的な...
目次序文ターゲット最初のステップ:ステップ2:ステップ3:ステップ4:要約する序文現在主流のフレーム...
ソースコードの例: https://codepen.io/shadeed/pen/03caf6b36...
新しく作成された Web サイトの場合は、ASP.NET MVC5 を例に挙げます。セッションを処理...
<meta http-equiv="X-UA-compatible" co...
導入いつものように、シーンから始めましょう〜インタビュアー:「トランザクションの4つの特性をご存知で...
いくつかの概念行ボックス: インライン ボックスを囲むボックス。1 つ以上の行ボックスが積み重ねられ...
*******************HTML言語入門(パート2)*****************...
目次1. 問題の発見2. プロセスの詳細情報を表示する3. 解決策4. 大法を再開する1. 問題の発...
日常的なウェブサイトの保守と管理では、多くの SQL ステートメントが使用されます。熟練して使用する...
覚えて: IDE ディスク: 最初のディスクは hda、2 番目のディスクは hdb...最初のディ...