一、B-Tree索引和hash索引
B-Tree索引是mysql数据库中使用最多的索引类型,除了Archive存储引擎,其他所有存储引擎都支持btree,不仅仅是在mysql中,其他很多的数据库都是以B-Tree索引作为主要的索引类型,主要因为B-tree在数据库的检索,排序,分组中,都有着优异的表现。
B-Tree索引的理论查询次数是n/2
Hash索引因其特殊的索引结构,使其检索效率非常高,可以一次到位,不像B-Tree索引必须经过多次的查找,从根节点开始一直到找到数据,IO效率远低于Hash。
但是也因其特殊性导致很多问题,比如
1.磁盘会产生很多空洞
2.无法对范围查询优化
3.无法利用前缀索引
4.必须回行,通过索引拿到数据位置,必须回到表中取数据
5.Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
B-Tree常见误区和B-Tree索引的左前缀原则
我们创建一个index(a,b,c)的联合索引
当我们的条件为
where a = 1 能,只是用了a列
where a = 1 and b = 2 能,使用了a,b列
where a = 1 and b = 2 and c = 3 能 使用了a,b,c列
where b = 2 或者 where c = 3 否
where a = 1 and c = 3 a列能发货索引,而c不能
where a = 1 and b>2 and c=3 a能,b能,c不能
where a = 1 and b like“xxx” and c=3 a能 ,b能,c不能
聚簇索引和非聚簇索引
myisam是非聚簇索引 , myisam索引指向行在磁盘上的位置,主(次)索引,都指向物理行(磁盘位置)
innodb是聚簇索引,innodb的主索引文件上,直接存放了该行的数据,次级索引指向对主键的引用
注意:innodb来说
1.主键索引,既存储索引值,又在叶子中存储行的数据
2.如果没有主键,则会unique key 做主键
3.如果没有unique,则系统生产一个内部的rowid做主键
聚簇索引的优势与劣势:
优势:根据主键查询条目比较少时,不用回行(数据就在主键节点下)
劣势:如果碰到不规则的数据插入时,造成频繁的页分裂