暂无图片
Mysql SQL索引优化
我来答
分享
佳佳
2021-08-04
Mysql SQL索引优化

SELECT count(0) FROM table_name WHERE update_date < ‘2021-08-03 00:00:00.000’ AND create_date >= ‘2021-07-04 00:00:00.000’ AND state = ‘2’ AND type = 1;

如果是这种where后有2个字段的范围查询,是不是必定有一个不会走索引?
如何建索引比较好?

我来答
添加附件
收藏
分享
问题补充
7条回答
默认
最新

两个日期建 组合索引就行了.

暂无图片 评论
暂无图片 有用 0
佳佳

(type,state,update_date,create_date) 如果创建这样的索引,不会去走吧?感觉会终止于索引的update_date列,不会再去过滤create_date吧?

暂无图片 评论
暂无图片 有用 0
薛晓刚

就你这句而言, create_date >= ‘2021-07-04 00:00:00.0会用到。
但是另外一个不会,因为另外一个是全部数据。
优化器会识别的。

暂无图片 评论
暂无图片 有用 0
佳佳
升级问题到: 潜在风险
暂无图片 评论
暂无图片 有用 1
薛晓刚

type第一列几乎不会起作用,mysql没有跳跃索引,很难用到。

暂无图片 评论
暂无图片 有用 0
Samson

优化器判断,比较合适会走index intersect merge

暂无图片 评论
暂无图片 有用 0
chengang

首先 create_date 与 update_date 谁的区分度更好。
谁的区分度更好就决定了,这两个字段哪个排在前面。

然后再看state与type 这两个区分度好不好。如果也有较好的区分度,那就再往前放。如果区分度差,就往后放。

假定两种情况
1、create_date区分度比update_date好,且state与type区分度很差
即建立(create_date,update_date,state,type)
这样一个索引,这个索引会完成索引覆盖。不需要回表。能利用create_date一个字段做seek,其它字段做ICP
2、update_date比create_date区分度好, state字段区分度也不错。type区分度差。
即建立(state,update_date,create_date,type)这样一个索引
这个索引能利用state与update_date两个字段来做seek,也能完成索引覆盖

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏