次のようにクエリを記述します:
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のみをフェッチした場合 、その場合、そのようなインデックスは「カバー」し、いくつかの利点があります。