1、概述
在mysql中,索引(index)又叫键(key),它是存储引擎用于快速找到所需记录的一种数据结构。在愈来愈大的表中,索引是对查询性能优化最有效的手段,索引对性能影响很是
关键。另外,mysql的索引是在存储引擎层实现,而不是在服务器层。
2、索引的工做原理
咱们知道,在看一本书某章的时候,首先咱们会查找目录索引,找到对应的页码而后快速找到相应的内容。mysql索引也同样,存储引擎利用相似的方法使用索引,先在索引中找到
对应的值,而后根据匹配的索引记录找到对应的数据行,而后返回结果。
例如,咱们想在一个10W条记录表 table 中查询name等于“张三”的数据行,select * from table where name ='张三'。那么在没有对name字段创建索引的状况下,咱们
须要扫描全表也就是扫描10W条数据来找到这条数据;若是咱们为name字段创建索引,咱们只须要查找索引,而后根据索引找到对应的数据行,只须要查找一条记录,性能会获得很
大的提升。
3、索引分类
索引按照实现方式不一样能够分为 B-Tree索引、hash索引、空间数据索引以及全文索引等。若是没有特别指明,多半用的是B-Tree索引,B-Tree 对索引列是顺序存储的,所以很
适合查找范围数据。它可以加快访问数据的速度,由于存储引擎再也不须要进行全表扫描来获取须要的数据。
4、索引类型
索引主要分为:单列索引(普通索引、主键索引、惟一索引)和组合索引。
普通索引:
CREATE INDEX name_Index ON `table`(`name`);
ALTER TABLE table ADD INDEX name_Index(`name`)
惟一索引:
CREATE UNIQUE INDEX id_UNIQUE_Index ON `table`(`id`);
主键索引:主键索引和惟一索引相似,惟一索引容许有空值,而主键索引不容许。
组合索引:通俗的说,组合索引就是一个表中一个索引包括多个字段,一个表中多个单列索引并非组合索引。
例如:
1
CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);
5、组合索引的查询规则(什么状况下有效,什么状况下无效)
B-Tree 索引适用于全键值、键值范围或键前缀查找,其中键前缀查找只适用于根据最左前缀查找。咱们创建表user(id,last_name,first_name, age ,birthday,sex),
创建组合索引 key(last_name, first_name, birthday),那么它实际上包括三个索引(last_name),(last_name,first_name),
(last_name,first_name,birthday)。
下面咱们来分析组合索引有效以及无效的状况,mysql在使用组合索引查询的时候须要遵循“最左前缀”规则,什么是“最左前缀”规则呢,就是在使用组合索引查询,where的条件要
按照从左到右的顺序,last_name first_name birthday,能够是只有last_name,或者包括last_name、first_name,或者last_name、first_name、birthday,这
个从左到右的顺序不能变,也不能跳过;若是是直接first_name='ruby' 组合索引不生效,或者跳过first_name,last_name=‘allon’ and birthday = ‘2012’,组合
索引只有last_name生效,后面的全部不生效。
例如:1、全键值匹配:select * from user where last_name=‘allon’ and first_name='java' and birthday=‘2017-12'是生效的,
若是 select * from user where first_name='java' and birthday=‘2017-12'组合索引是不生效的,由于没有key(first_name,birthday)的索引。
2、键前缀查找:select * from user where last_name=‘allon’;这个索引存在,也是有效的,但不能select * from user where first_name='java',这样不生效。
3、like模糊查询:好比只匹配组合索引第一列的值的开头部分,查询last_name姓张的人,select * from user where last_name like ‘张%’;
可是不能select * from user where last_name like ‘%张’;组合索引也没法查找以张结尾的人。
再如 select * from user where last_name='allon' and first_name like '三%' and birthday = '2012-11-06',
由于first_name用了like这个范围查询条件,那么查询只用到了组合索引的前两列,范围查询右面的列birthday没法用索引优化查询。
若是查询中有某个列的范围查询,则该列右边的全部列都没法使用索引优化查找
4、匹配范围值:select * from user where last_name between ’allon‘ and 'clitton';这里只使用了组合索引的第一列,是生效的。
6、索引的优缺点
优势:1、创建索引后,在查询的时候合理利用索引可以提升数据库性能;
2、主键索引 惟一索引能保证表中每一条数据的惟一性
3、减小分组和排序的时间
4、在表链接的链接条件上使用索引,能够加速表与表之间的相连。
缺点:1、建立索引和维护索引须要时间消耗;
2、索引文件占用物理空间
3、当对表的数据进行insert update delete时候须要维护索引,会下降数据的维护数据。