2

このようなインデックスを持つテーブルアーティストがあります

combo1 => by_id, origin, genre

クエリを実行します

SELECT * FROM artists 
    WHERE by_id = '324' 
      AND genre = 'rock' 
      AND origin = 'Australia'

SELECT * FROM artists 
    WHERE by_id = '324' 
      AND origin = 'Australia' 
      AND genre = 'rock'

明らかに、2 番目のクエリでは、インデックスにあるとおりに列が言及されています。EXPLAINこれらを実行すると、インデックスを使用していると表示されます。しかし、2番目が最初のものよりも速いかどうかは少し混乱しています。それは...ですか?

4

2 に答える 2

3

列が含まれている限り、オプティマイザーが順序を処理するため、違いはありません。

WHERE by_id = '324' AND origin = 'Australia' AND genre = 'rock'
| | ID | SELECT_TYPE | 表 | タイプ | POSSIBLE_KEYS | キー | キー_レン | 参照 | 行 | 行 | おまけ |
-------------------------------------------------- -------------------------------------------------- ---------------
| | 1 | シンプル | アーティスト | 定数 | プライマリ | プライマリ | 80 | 定数、定数、定数 | 1 | インデックスの使用 |
WHERE by_id = '324' AND genre = 'rock' AND origin = 'Australia'
| | ID | SELECT_TYPE | 表 | タイプ | POSSIBLE_KEYS | キー | キー_レン | 参照 | 行 | 行 | おまけ |
-------------------------------------------------- -------------------------------------------------- ---------------
| | 1 | シンプル | アーティスト | 定数 | プライマリ | プライマリ | 80 | 定数、定数、定数 | 1 | インデックスの使用 |

たまたま を省略していた場合by_id、インデックスは使用されませんでした (インデックスは左から右に機能します)。

WHERE genre = 'rock'
| | ID | SELECT_TYPE | 表 | タイプ | POSSIBLE_KEYS | キー | キー_レン | 参照 | 行 | 行 | おまけ |
-------------------------------------------------- -------------------------------------------------- -----------------
| | 1 | シンプル | アーティスト | インデックス | (ヌル) | プライマリ | 80 | (ヌル) | 1 | where を使用します。インデックスの使用 |
WHERE origin='Australia' AND genre = 'rock'
| | ID | SELECT_TYPE | 表 | タイプ | POSSIBLE_KEYS | キー | キー_レン | 参照 | 行 | 行 | おまけ |
-------------------------------------------------- -------------------------------------------------- -----------------
| | 1 | シンプル | アーティスト | インデックス | (ヌル) | プライマリ | 80 | (ヌル) | 1 | where を使用します。インデックスの使用 |
于 2013-03-09T18:14:08.253 に答える
-3

2 番目のクエリは、最初のクエリよりも高速である必要があります。

インデックス定義で列がリストされる順序は重要です。最初のインデックス付き列のみを使用して、一連の行識別子を取得することができます。ただし、(ほとんどのデータベースでは) 2 番目以降のインデックス付き列のみを使用して行識別子のセットを取得することは不可能であるか、効率的ではありません。

たとえば、市区町村、姓、名の順で編成された電話帳を想像してみてください。都市が指定されている場合、その都市のすべての電話番号のリストを簡単に抽出できます。ただし、この電話帳では、特定の姓のすべての電話番号を見つけるのは非常に面倒です。その姓のエントリについては、各都市のセクション内を調べる必要があります。これを実行できるデータベースもあれば、単にインデックスを使用しないデータベースもあります。

于 2013-03-09T18:14:02.443 に答える