当存在多个索引的情况下, 有时候Mysql自动选的索引并不是最优的, 此时需要显式指定一个更优索引。
如想查询今天领取且已过期状态的优惠券
刚开始使用的sql是
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万多数据
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条记录
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 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。