sql >> データベース >  >> RDS >> Mysql

MySQLは私のインデックスに適していますか?

    次のようにクエリを記述します:

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




    1. 複数のストアドプロシージャを呼び出すCodeIgniterアクティブレコードの問題

    2. データベース+Windows認証+ユーザー名/パスワード?

    3. 文字列の特定の部分で並べ替える方法は?

    4. 列ではなく行形式でクエリを返す