當存在多個索引的狀況下, 有時候Mysql自動選的索引並非最優的, 此時須要顯式指定一個更優索引。sql
如想查詢今天領取且已過時狀態的優惠券spa
剛開始使用的sql是code
select * from coupon_user where status = '20' and create_time > current_date order by id desc ;
要等半天才有結果 查看錶結構 發現status和create_time均加了索引索引
KEY `idx_status` (`status`), KEY `create_time` (`create_time`),
但實際使用的是status索引 故需查詢1349萬多數據it
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | coupon_use | range | idx_status,create_time | idx_status | 9 | const | 13498998 | Using where; |
針對這種情形 能夠強制使用create_time索引 此時只需查詢7410條記錄io
select * from coupon_user force index(create_time) where status = '20' and create_time > current_date order by id desc;
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | coupon_use | range | idx_status,create_time | create_time | 4 | 7410 | Using index condition; Using where; Using filesort |