一,什么是索引?
索引是存储引擎用户快速找到记录的一种数据结构,所以索引是数据结构。
索引优化是对查询性能最有效的手段,索引能够轻松把查询性能提升到好几个级别。
1.1 索引的类型
1.1.1 B-Tree
B-tree意味着所有值都是按照顺序进行存储的。b-tree索引能够加速访问数据的速度,因为存储引擎不再需要进行全表的扫描来获取需要的数据,而是从树的根节点进行搜索,根节点的槽中存放了指向子节点的指针,引擎根据指针向下查找。
create table people(
last_name varchar(45) not null,
first_name varchar(45) not null,
dob date not null,
gender enum("m","f") not null,
key(last_name,first_name,dob)
);
如上代码显示,创建了一个索引包含三个列,则对于该节点的数据是有三个列组成,并且排序规则是按照创建该索引时的顺序进行排序
key(last_name,first_name,dob)
使用该索引有效的方式如下:
全值匹配:就是匹配三个完全的值进行索引查找
key(last_name,first_name,dob)
匹配最左前缀:匹配最左边的值,例如查询姓为Allen的人,就只是使用索引的第一列
匹配列前缀:比如查找用A开头的人
匹配范围值:可以查找姓在Allen和Tom之间的人,这里也只是使用了索引的第一列
使用该索引限制的方式如下:
1,如果不是从最左边开始进行查找则,该索引无效。
2,不能跳过索引中的列
3,如果查找中有某个列的范围,则该范围条件的右边都无法用索引优化进行查找。例如
WHERE last_name = 'smith' AND first_name LIKE 'J%' AND dob = '1976-12.23'
1.1.2 哈希索引
什么是哈希索引?
哈希索引是类似一个有序表的形式,如同数组,哈希索引基于哈希表实现,只有精确匹配所有列的查询才会有效果,对于每一行的数据,存储引擎都会计算出一个独一无二的哈希值,然后把哈希值存在哈希表里面, 每次需要查找的时候,把该行的数据进行哈希运算,得出一个哈希值,然后把该哈希值放在哈希表进行对比,速度很快。
在mysql里面只有Memory支持哈希索引。
1.1.3 空间数据索引(R-Tree)
该索引类型只有MyISAM支持,略。
1.1.4 全文索引
全文索引是一种特殊类型的索引,它查找的是文本中的关键字,而不是直接搜索索引中的值,全文搜索和其他几种完全不一样。
1.1.5 其他索引类型
还有其他一些第三方实现的存储引擎。这里主要讲的是myisan和innodb的索引类型。
二 索引的优点
2.1.1 索引可以让服务器快速定位到数据的所在地址,这不是索引的唯一作用,到目前为止,根据索引的不同设计,附带的功能也是不一样的。
最常见的是B-tree索引,按照顺序存储,所以mysql可用用来做OrderBy 和GroupBy操作,因为数据是有序的,所以B-tree也就会把相关的值存储在一起,最后,因为索引中存储了实际的列值,所以某些查询只需要使用索引就能够完全完成全部查询,特此总结如下:
1,索引大大减少了服务器需要扫描的总数据量,不用进行全表的扫描,而是根据索引进行某特定的位置进行扫描,比如平衡二叉树的跟节点进行查找。
2,避免服务器进行排序和临时表。
3,可以把服务器的随机IO变为顺序IO,减少磁盘寻道时间,加速查找数据。
三 高性能的索引策略
3.1.1 独立的列
如果查询中的列不是一个独立的列,那么mysql不能使用这个列做索引查找,意思是如果该列在where中的条件是一个公式类型的,则mysql不会用到该索引,例如
select * from emp where empno + 1 =5
即使empno是一个主键索引但是,用了表达式则不能当索引查找。
3.1.2 前缀索引和索引选择性