私はこの問題は、MySQLがさえI FORCE INDEX(PRIMARY
)場合は、インデックスを使用していないこと、である(a、b)はMySQLがWHERE INのコンポジットでインデックスを使用しないのはなぜですか?
SELECT * FROM table WHERE (a, b) IN ((1,2), (2,4), (1,3))
PRIMARY KEYを持つテーブルから複合インデックスで複数のレコードを取得しようとしています。
EXPLAIN SELECTにnull possible_keysが表示されます。
なぜ可能な_キーはありませんか? WHERE()IN(()、()) を使用してUNION ALL
- を使用してOR
- :どのような複合キーで複数の行を取得するための最良の方法である
PS
a_b
basiclyCONCAT(a, '-', b)
と、ちょうどその(WHERE a_b = {$id1}-{$id2}
)を比較です:クエリはSELECT * FROM table WHERE (a = 1 AND b = 2) OR (a = 2 AND b = 4) OR (a = 1 AND b = 3)
おかげで、特定の列にインデックスを付けるの強い希望で
を 'CONCAT使用(、 ' - '、b)のそれは失敗することとして、'、私にとっては良い選択肢ではありませんフィールド値に '' - ''があるとします。 私のPRIMARY KEYは複数列なので、 'a'と' b'の両方を含んでいます。 – vearutop
'CONCAT(a、 '! - !'、b)' - あなたはその値を使っていますか? :) –
私のテーブルには何億ものレコードが含まれていますが、インデックス付きの文字列ではパフォーマンスが向上しないと思います。むしろバッチコンポジットを選択するには、UNION ALLを使用します。 – vearutop