次のようにクエリを記述します:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
使用するインデックスを指定しないでください。
WHERE
から開始 条項、これはかもしれないのように見えます 便利:INDEX(status)
。ただし、「ステータス」はカーディナリティの低い「フラグ」のように聞こえるので、オプティマイザは インデックスを無視して、単にテーブルスキャンを実行することにしました。 これで問題ありません。 インデックスがあまり選択的でない場合は、インデックスとデータの間でバウンスするよりもテーブルスキャンを実行する方が高速であるため、問題ありません。いずれの場合も、決定はオプティマイザーに任せてください。
orders
を処理しているので 、JOIN
する必要があります users
へ 。これを行う唯一の方法は、id
にインデックスを付けることです。 。その名前( "id")は、それがPRIMARY KEY
である可能性があることを意味します 、 それは...ですか? (SHOW CREATE TABLE
を提供してください 。)
あなたが言及した他のクエリは書かれるべきです
SELECT * FROM users WHERE id=33
そして、すでに説明したように、インデックス(PRIMARY KEY
?)id
正しいことです。
利点はありません(特定のSELECTs
に対して) 、少なくとも)INDEX(status, id_user)
の場合 。選択にはすべての列が含まれます(*
); id_user
のみをフェッチした場合 、その場合、そのようなインデックスは「カバー」し、いくつかの利点があります。