定义:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,
它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引(Index)是帮助MySQL高效获取数据的数据结构。
索引的本质是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
分类:
按照物理存储分类分为{聚簇索引,非聚簇索引};;
聚簇索引:
将数据跟索引结构放在一起。一个表只有一个聚簇索引,默认主键,如果没有主键,InnoDB会选择一个唯一且非空索引替代,如果没有这样的索引,InnoDB会隐式定义一个6个字节大小的row_id作为主键,作为聚簇索引中的索引。
非聚簇索引(辅助索引):
在聚簇索引上创建的索引称之为辅助索引,即非聚簇索引。辅助索引访问数据总是需要二次查找。每张表可以有多个辅助索引。索引和数据分开存储
聚簇索引优缺点;
优点:
数据访问更快,聚簇索引将索引和数据存放在同一个B+树中。 对于主键的排序查找和范围查找速度非常快。
(聚簇索引数据的存储是有序的,所以在进行排序查找和范围查找的速度也是非常快的。)
缺点:
插入速度严重依赖于插入顺序,按照主键的顺序插入很快,如果不按照此方式插入会很慢,影响性能。
按照字段特性分为{
主键索引; 不允许有空值
普通索引; 没有任何限制
唯一索引: 索引列的值必须唯一,但是允许有空值。
复合索引: alter table test add idx_a1_a2_a3 table(a1,a2,a3) 最常用的放在最左边,遵循“最左前缀原则”}
回表:😒
如果一个查询先走辅助索引(不是聚簇索引),通过这个索引没有查到全部数据,那么MySQL,会用辅助索引查询出来的主键去聚簇索引中查询。
索引覆盖
如果一个查询先走辅助索引,通过辅助索引直接获取到我想要的全部数据,不需要回表,这个过程叫 索引覆盖。
最左前缀原则
从最左侧索引开始匹配,遇到范围查询( > < between,like)会让后面的索引失效;
select * from table1 where a=1 and b=2 and c<3 and d=4; 如果(a,b,c,d)联合索引,d的索引是用不到的,
select * from table1 where a=1 and b=2 and d=4 and c<3; 此时可以。
索引失效的集中情况
1、 like查询以%开头, like %a 会失效,因为模糊查询,通配符放在左侧是用不上索引的因为每条记录都是有可能匹配的,只有检查每条记录才能确定是不是满足模糊匹配条件
但是 like a% 不会。a%可以筛选出索引相关的值,并且mysql会自动排序。
2、 类型转化(索引字段和条件或者关联字段类型不一致),列计算(±*/)。
3、 全表扫描。
4、条件中有or且or连接字段中的列没有索引,那么即使其中有条件带索引也不会使用索引。当检索条件中有or但是所有条件都有索引时索引不会失效。
5、复合索引不满足最左原则。
6,使用 != , is null , is not null时,使用order by ,使用函数时,索引会失效。
常见索引优化手段
1、尽可能使用复合索引而不是索引的组合。
2、创建索引尽量让辅助索引进行索引覆盖,避免回表。
3、在可以使用主键id的表里,尽量使用自增主键id。
4、查询尽量不要使用select *, 避免大量回表。
5、尽量少的使用子查询,可使用外连接替代,避免产生笛卡尔集。
查看索引语法 : show index from tableName;
添加主键索引 : alter table tableName add primary key(id);
添加唯一索引 : create unique index indexName on tableName(要添加索引的字段名)
添加普通索引 : create index indexName on tableName(字段名[,字段名2..])
添加复合索引 : create index indxfullName on tableName(firstName,lastName) # 如果姓名不重复
删除索引 : drop index indexName on tableName;
索引的优点是什么
提高检索效率,降低数据库IO成本。
如果创建的是唯一索引,可以保证数据库中每一行数据的唯一性。
加速两个表之间的连接,一般在外键上创建索引。
索引的缺点是什么
需要占用物理空间,索引越多,占用空间越大。
创建和维护索引需要时间,会随着数据量的增加而增多。
会降低表的增删改效率,每次增删改索引都需要进行动态维护,导致时间变长。
什么时候适合创建索引,什么时候不适合创建索引?
需要创建索引的几种情况:
1. 字典值在业务上是唯一的, 比如用户表的身份证,
2. where条件中频繁使用的字段
select * from user where code = 1; --- code就是频繁使用,可以增加一个普通索引
3. 经常group by 和order by 的字段
4. distinct字段
不适合创建索引的集中情况:
1. 对于查询中使用的少的字段尽量不要创建索引,创建索引是有成本的,占用空间,且维护成本较高,增删改效率会降低。
2. 数据密度小的列也不建议创建索引
3. 大量数据重复的列尽量不要创建索引
4. 经常更新的表尽量不要创建较多索引,会影响效率。
5. 无序的值(UUID) 不要建索引
索引的2个特点:
通过数据结构和算法来对原始的数据进行一些有效的组织
通过这些有效的组织,可以引导使用者对原始数据进行快速检索