一般的な状況: 1. 関数または演算を使用する; 2. 暗黙的な型変換; 3. 等しくない (!= または <>) を使用する; 4. LIKE 演算子を使用し、ワイルドカードで始める; 4. LIKE 演算子を使用し、ワイルドカードで開始する。 5. OR 条件、6. NULL 値、7. 低いインデックス選択性、8. 複合インデックスの左端のプレフィックスの原則、9. オプティマイザーの意思決定、10. FORCE INDEX および IGNORE INDEX。
MySQL のインデックスは、クエリのパフォーマンスを最適化するのに役立つ重要なツールですが、場合によっては、インデックスが期待どおりに機能しない、つまりインデックスが「失敗」することがあります。
MySQL インデックスの失敗を引き起こす一般的な状況は次のとおりです:
: 関数を使用するとき、またはインデックス付きカラムに対して操作を実行するとき、通常、インデックスは有効になりません。例:
SELECT * FROM users WHERE YEAR(date_column) = 2023;
ここで、YEAR(date_column) はインデックスを無効にします。
2. 暗黙的な型変換: クエリ条件に暗黙的な型変換が含まれる場合、インデックスは使用できない場合があります。たとえば、列の型が文字列であるのに数値を使用してクエリを実行する場合、またはその逆の場合です。
SELECT * FROM users WHERE id = '123'; -- 假设id是整数类型
不等号 (!= または <>) を使用する: 不等号演算子を使用すると、インデックスの複数の値をスキャンする必要があるため、通常、インデックスが失敗します。
SELECT * FROM users WHERE age != 25;
LIKE 演算子を使用し、ワイルドカード文字で開始します。LIKE 演算子が使用され、パターンがワイルドカード文字 % で始まる場合、インデックスは通常、発効しません。
SELECT * FROM users WHERE name LIKE '%Smith%';
OR 条件: OR 条件を使用する場合、関係するすべての列がインデックス付けされていない場合、または条件の 1 つによってインデックス障害が発生した場合、クエリ全体が失敗する可能性があります。 be インデックスは使用されません。
SELECT * FROM users WHERE age = 25 OR name = 'John';
NULL值:如果索引列包含NULL值,并且查询条件涉及到NULL,索引可能不会生效。
SELECT * FROM users WHERE age IS NULL;
为了避免索引失效,建议:
以上がmysql インデックス障害のいくつかの状況の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。