什么是索引呢?索引是一种数据结构,是为了加快查找的速度,mysql默认使用B+树索引。
什么是B+ 树?这得从平衡二叉树说起,平衡二叉树是每一个子树的高度差的绝对值不超过1,这样导致查找数据的时间复杂度为n(logN),但是它也有问题,就是他是一个二叉树,所以如果有海量的数据,必当深度很深,所以就引入了B树,最开始几个版本的mysql就是用的B树,B树就是可以允许多子链接的平衡树,这样每一个节点都有很多子树,就可以明显降低树的深度;而进一步改进,就是B+ 树,B+树就是在B树的基础上,数据只存在叶子节点上,这样就节约索引的空间,同样空间能建立更多索引;而在叶子节点上,每一个节点又有链相连,这样读取几块叶子节点的数据,就可以不用重新查找,节约时间。
那应该在什么列建索引呢?
1、在维度高列,就是重复数据小的列建索引;
2、经常建立order by ,where,group by的列建立索引。
3、数据量小的列,比如数字编号,不要在数据量大的列建索引,这样会导致索引占的空间很大。
索引也不是越多越好,这是因为:
1、数据量小的不用建立索引;
2、增加额外的磁盘空间;
3、每增删改一次就得从新建立索引
建索引一定会变快吗?
不一定
1、查询属性不涉及创建索引的属性
2、查询时返回的结果数量是整个表数量的10%以上时
3、查询的种类与索引的种类不符,比如hash索引不能够提高范围查询的效率
创建索引会使查询操作变得更加快速,但是会降低增加、删除、更新操作的速度,因为执行这些操作的同时会对索引文件进行重新排序或更新
什么时候不走索引?
1、索引列参与计算,不走索引(SELECT sname FROM stu WHERE age+10=30;)
2、如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引,建议大家尽量避免使用or关键字。
复合索引:
复合索引也叫组合索引;
用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。
复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;
同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;
设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效;
索引类型:
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
ps.索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖