本文草稿与三月初创作,但是由于刚换新工作比较忙,因此没及时完成并发表。
索引的主要作用是加快数据的查找,但是索引本身也是需要存储的,由于索引文件可能很大,因此不能常驻内存,在用到的时候需要从硬盘种加载,常识性我们都知道,计算机io是非常耗时的操作,那么如何减少io便是索引设计的重点。
mysql索引属于存储引擎,不同存储引擎实现方式不同。
MyISAM引擎使用b+tree作为索引,叶子节点data存放的是记录地址。MyISAM中主索引与辅助索引形式是一样的,主索引要求key不能重复,辅助索引key可以重复。这种索引方式叫非聚集索引。
InnoDB引擎辅助索引叶子节点存放的是主键,正式这个设计,所以不建议主键使用长字段,因为会导致辅助索引data占用空间太大。
最左前缀
现在假设有一个表Table1 ,含有A,B,C,D,E五个字段
现在建一个联合索引A,B,C
什么时候能用到这个索引呢
全部使用
where A=1 AND B=1 AND C=1(where C=1 AND B=1 AND A=1...)
这个时候是可以用上的,三个都用上
使用左边两个
where A=1 AND B=1 (where B=1 AND A=1)
使用左边一个
这个时候也能用上,用上两列
where A=1 AND C=1 (where C=1 AND A=1)
这个时候也能用上,但只能使用A
缺少最左边一个
where B=1 AND C=1(where C=1 AND B=1)
这个时候用不上
剩下情况不一一举例
结论是从最左边匹配,条件中能从最左边连续匹配几个就能用到几个。
范围查询
范围会用到索引吗?会,不过在范围字段后的列就不再使用索引。
例如
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C=2
这种情况只能使用索引A,B。
同理两个连续的范围也只能使用上第一个匹配的范围索引,如下
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C<3
只能使用A,B。
like会用到索引吗
只要like中的通配符不出现在最左端就能使用索引。
查询条件中有函数会使用索引吗?
不会
索引选择性
假设有100调数据 a列不同的数据有90条,那么选择性为0.9,选择性越接近1索引性能越好。
其实本来在着手写这篇文章时编写思路的把索引相关的东西都讲到,但是由于放了将近一个月的时间,思路完全丢失,想不起来本来打算按哪个线写下去了,以后也长个经验,写文章一气呵成,不然就不写。这篇文章就等慢慢遇到哪点想写就补充到里边吧。