4

PRIMARY KEY(a、b)を持つテーブルから複合インデックスで複数のレコードを取得しようとしています

SELECT * FROM table WHERE (a, b) IN ((1,2), (2,4), (1,3))

問題は、I FORCE INDEX()を使用しても、MySQLがインデックスを使用していないことPRIMARYです。
EXPLAIN SELECTは、nullのpossible_keysを示します。

なぜpossible_keysがないのですか?

複合キーで複数の行を取得するための最良の方法は何ですか。

  • ORを使用
  • UNIONALLを使用する
  • WHERE()IN(()、())を使用する

PSクエリは結果によって次のようになります

SELECT * FROM table WHERE (a = 1 AND b = 2) OR (a = 2 AND b = 4) OR (a = 1 AND b = 3)

ありがとう

4

3 に答える 3

3

クエリが複合によってインデックスからフィールドのみを選択する場合(またはテーブルに他のフィールドがない場合)WHERE ... IN、インデックスが使用されます。

SELECT a,b FROM `table` WHERE (a, b) IN ((1,2), (2,4), (1,3))

それ以外の場合は使用されません。回避策は、派生クエリを使用することです。

SELECT t.* FROM (SELECT a, b FROM `table` WHERE (a, b) IN ((1,2), (2,4), (1,3))) AS o INNER JOIN `table` AS t ON (t.a = o.a AND t.b = o.b)

説明の選択:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    2   
1   PRIMARY t   eq_ref  PRIMARY PRIMARY 2   o.a,o.b 1   
2   DERIVED table   index   NULL    PRIMARY 2   NULL    6   Using where; Using index
于 2012-03-07T07:20:36.963 に答える
0

特定の列にインデックスを付けることを強く望んでいるので、新しい列を作成することを検討しましたか?a_b基本的にはそれCONCAT(a, '-', b)を比較します(WHERE a_b = {$id1}-{$id2})?

また、テーブルごとに1つのPRIMARY列のみを持つことができます。aプライマリのインデックスを作成することはできません。b

于 2012-03-06T10:37:07.440 に答える
0

列a、bに結合インデックスを作成してみてください。

インデックスは主キーである必要はなく、それでも大いに役立ちます。

ここであなたの問題に関する詳細情報:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

于 2012-03-06T12:51:41.503 に答える