索引就用空间来换取时间
explain学习和参数代表的意思请参考 https://blog.csdn.net/ywdhzxf/article/details/84316712
下面我会用explain 来测试联合索引和普通索引的作用项, 只测两个字段, source和name
有兴趣的可以看下我下面的测试, 并不繁琐, 没兴趣的直接看结论吧
1 联合索引 只有命中第一个字段(索引里的顺序第一个)才会走索引, 即比如我的联合索引是name+source, 那么我只拿name当where当条件也会命中索引, 但是用source就不会了, 查询全部的数据;
2 如果只是两个字段联合查询的话, 两个字段单个查询的次数也比较高, 那么就不如直接建立两个普通索引了(我的测试用的都是等于, 如果有其他条件的命中rows较多的话还是建议联合索引, 毕竟联合索引的type优先级较高);
3 如果几个字段经常联合查询的话, 很有必要建一个联合索引, 但可以把某个单个查询应用较高的字段放在第一位, 这样也比较省索引了;
4 相同rows的情况下, type的优先级越高(type的优先级查看explain学习那篇), 查的越快;
做的简单测试, 如果不对请大神评论指导, 谢谢.
联合索引(name+source), 普通索引(source, name)
select * from db where source=1 and name=1
explain 测试:
三个索引全部命中
type ref
rows 21行
select * from db where name=1
eplain 测试:
命中两个索引
type ref
rows 30行
联合索引(name+source)
select * from db where source=1 and name=1
explain 测试:
联合索引命中
type ref
rows 21行
select * from db where name=1
eplain 测试:
命中索引
type ref
rows 30行
select * from db where source=1
explain 测试:
没有命中索引
type all
rows 10W+(所有的数据)
普通索引(source, name)
select * from db where source=1 and name=1
explain 测试:
命中两个索引
type index_merge
rows 2
select * from db where name=1
eplain 测试:
命中索引
type ref
rows 30