2020-09-16
请问mysql为什么选择了和我们想象不一样的索引了
1、sql的执行计划如下:
desc select * from live_message WHERE msg_type = 18 and create_time > '2020-09-16 15:47:58.137' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: live_message
partitions: NULL
type: range
possible_keys: idx_createtime_msgtype,idx_msg_type_id,idx_msg_type_create_time_id
key: idx_msg_type_create_time_id
key_len: 9
ref: NULL
rows: 2990
filtered: 100.00
Extra: Using index condition
1 row in set, 1 warning (0.00 sec)
2、看一下这个表的索引

3、很奇怪,为什么mysql选择的是idx_msg_type_create_time_id索引呢,而不选择idx_createtime_msgtype索引。
大家都说,在建立索引时,要把选择性高的字段放在前面,根据这个表,应该是create_time这个字段选择性高,理应是idx_createtime_msgtype这个联合索引是最佳选择。
可是,Mysql竟然选择了idx_msg_type_create_time_id 这个索引,要知道这个索引的msg_type做为第一个,他的选择性是不高的。
通过如下可以验证。

select count(*) from live_message where msg_type = 18 ;
+----------+
| count(*) |
+----------+
| 99307 |
+----------+
1 row in set (0.02 sec)
select count(*) from live_message where create_time > '2020-09-16 15:47:58.137' ;
+----------+
| count(*) |
+----------+
| 24961 |
+----------+
1 row in set (0.01 sec)
4、请问,这是为什么呢
收藏
分享
3条回答
默认
最新
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏


评论
