定义:帮助MySQL高效获取数据的数据结构。简单理解为排好序的快速查找数据(BTree)结构。以索引文件的形式存储在磁盘上。
平常所说的索引默认为BTree结构组织的索引,其中聚集索引、次要索引、复合索引、前缀索引、唯一索引默认都是使用B+树索引,除此外还有哈希索引等。
- 优势:提高检索效率,降低数据库IO成本;索引列对数据排序,降低数据排序成本,降低CPU消耗。
- 劣势:实际上索引也是一张表,该表保存主键与索引字段,并指向实体表的记录,所以索引列也要占空间;虽然索引提高查询速度,同时会降低表更新速度,因为mysql不仅要保存数据,还要保存索引文件每次更新添加索引列的字段。
分类:单值索引、唯一索引、复合索引
- 需要创建索引情况:1、逐渐自动建立唯一索引;2、频繁作为查询条件的字段;3、外键关系建立索引;4、排序字段作索引提升排序速度;5、统计或分组字段作索引。
- 不需要建索引情况:表记录少(<300W);频繁更新字段;where条件里用不到的字段;索引列中重复数据多。
索引优化
- left join:根据左连接特性,leftjoin用于确定如何从右表搜索行,左边一定有,故而右边是关键点,要建索引。
- 同理right join左边表建索引。
- 防止索引失效的十条
(1)全值匹配我最爱
(2)最佳左前缀法则 —— 组合索引中要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。
(3)不在索引列上做任何操作,包括计算、函数、自动或手动类型转换,会导致索引失效而全表扫描。
(4)索引中范围条件右边的列都失效
(5)尽量使用覆盖索引,减少select *
(6)在使用!= <>的时候无法使用索引
(7)is null,is not null无法使用索引
(8)like以通配符开头,如'%abc...'无法使用索引,'abc...%'这样的可以。
若非要使用'%abc%',那么select的字段不能超过索引列。
(9)字符串不加单引号索引失效
(10)少使用or,做连接时索引失效