MySQL的索引实现由很多种实现,包括hash索引,B+索引,全文索引等,本文只讨论B+树索引。
为什么使用B+树索引?
1.评价一个索引好坏主要看IO的访问次数,B+树红黑树来说,树高很小(出度很大)即可以有效降低IO的访问次数。B+数的高度h=logd(n),d越大,h越小,查询效率越高。相对B树,B+树d可以很大,因为非叶子节点不存储数据,只存储key,在一个存储页上可以存储更多的key值。在每个页上可以存储更多的key,即d很大。
2.外存按照页进行逻辑划分,页大小固定,当读入外存数据时,会根据局部性原理每次会预读连续的多页数据到内存。B+树的叶子节点是存储是连续和有序的,在查询时,尤其在范围查询时较少的IO次数可以访问到所需的数据。
InnonDB引擎B+树索引是怎么实现的?
1.InnoDB使用聚集索引,数据根据主索引存储在叶子节点上,辅助索引的data域存储主键,索引innodb必须具有主键,并且主键是最好是单调递增的,主键的长度不要过长,负责会浪费空间。myisam使用非聚集索引,即主索引(B+树)的叶子节点存储数据的地址,索引myisam可以没有主键,数据也不是存储在B+主索引的叶子节点上的。
怎样选择索引怎样优化索引?
1.索引遵循最左性原理,例如联合索引是有序的(a,b,c),在查询时查询条件是a,ab,abc的精确匹配,都会使用索引,但是如下情况不能使用索引。
1.1 如果不是连续的例如ac,不会使用索引,不过b可以使用in的方式构造索引条件,当然也可以增加ac辅助索引;
1.2 b,c单独精确查询都不会用到索引;
1.3 使用like语句,通配符不在开头可以使用索引;
1.4 范围列查询只能使用第一个列索引,但是有时between and 等多值匹配可以使用索引;
1.5 使用函数或者表达式对列查询,不会使用索引;
2.索引选择性
数据表大于2000建立索引;选择性低即区分度不大的列不适合索引;可以截取前缀作为索引,减少索引长度;一定使用一个自增的字段作为索引。
性能优化常用工具有哪些?
1.使用explain 和show profiles;可以查看索引使用情况和执行效率。explain使用方法和数据含义查看下列文章。