定义:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。说白了就是相当于书中的目录。
优点:
1.大大减少了服务器需要扫描的数据量
2.帮助服务器避免排序和临时表
3.将随机IO变为顺序IO
用处:
1、快速查找匹配WHERE子句的行
2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引
3、如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行
4、当有表连接的时候,从其他表检索行数据
5、查找特定索引列的min或max值
6、如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
7、在某些情况下,可以优化查询以检索值而无需查询数据行
分类:
1、主键索引
2、唯一索引
3、普通索引
4、全文索引
5、组合索引
技术名词:
回表
覆盖索引
最左匹配
索引下推
索引采用的数据结构:
哈希表
B+树
索引匹配方式:
1、全值匹配
指的是和索引中的所有列进行匹配
例:explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
2、匹配最左前缀
只匹配前面几列
例:
explain select * from staffs where name = 'July' and age = '23';
explain select * from staffs where name = 'July';
3.匹配列前缀
可以匹配某一列的值的开头部分
例:
explain select * from staffs where name like 'J%';
explain select * from staffs where name = 'July';
4.匹配范围值
可以查找某一个范围的数据
例:
explain select * from staffs where name like 'J%';
explain select * from staffs where name like '%y';
5.精确匹配某一列并范围匹配另外一列
可以查询第一列的全部和第二列的部分
例:explain select * from staffs where name = 'July' and age > 25;
6.只访问索引的查询
查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引
例:explain select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';