customers
次の構造のMySQL5.1InnoDBテーブル( )があります。
int record_id (PRIMARY KEY)
int user_id (ALLOW NULL)
varchar[11] postcode (ALLOW NULL)
varchar[30] region (ALLOW NULL)
..
..
..
テーブルには約700万行あります。現在、テーブルは次のようにクエリされています。
SELECT * FROM customers WHERE user_id IN (32343, 45676, 12345, 98765, 66010, ...
実際のクエリでは、現在560user_id
秒以上がIN
句に含まれています。テーブルに数百万のレコードがあるため、このクエリは低速です。
テーブルにはセカンダリインデックスがあり、最初のインデックスはuser_id
それ自体にあり、役立つと思いました。
私はそれSELECT(*)
が悪いことであることを知っています、そしてこれは必要なフィールドの完全なリストに拡張されます。ただし、上記にリストされていないフィールドは、より多くint
のsとdouble
sです。返送されたものはさらに50個ありますが、レポートに必要です。
のデータにアクセスするためのはるかに優れた方法があるuser_id
と思いますが、その方法を考えることはできません。私の最初の反応は、処理がクエリの速度を低下させることを理解しているので、フィールドALLOW NULL
上のを削除することです。user_id
NULL
この方法を使用するよりも効率的な方向に私を向けていただければ幸いですIN ( )
。
ランEXPLAINを編集します。
select_type = SIMPLE
table = customers
type = range
possible_keys = userid_idx
key = userid_idx
key_len = 5
ref = (NULL)
rows = 637640
Extra = Using where
それは役に立ちますか?