索引类似书本的目录,查询书中的指定内容时,先在目录上查找,之后可快速定位到内容位置。在数据库中通常通过 B 树 / B + 树数据结构实现。
主键索引树中叶子节点存储的是整行数据,而非主键索引叶子节点上保存的是主键的值。使用非主键索引时,先从非主键索引获取到行对应主键 ID,之后再根据 id 在主键索引树上搜索对应行数据,这个过程也被称为回表。
一般使用 innodb 的自增整数类型作为主键:
为查询条件字段创建索引,以达到快速过滤指定条件数据的目的。
当使用 order by 将查询结果按某个字段排序时,可考虑为该字段创建索引。没有索引时,会先将查询结果放到内存中进行排序(若内存空间不足,会利用磁盘辅助排序),比较影响查询效率。索引本身是有序的,可以直接按索引的顺序逐条回表取出数据即可。如果是分页查询,效果更好,这时候只需要取出某个范围的索引对应的数据,而不需要取出所有满足条件的数据排序后再截取返回分页数据。
使用 join 时,为被驱动表的关联字段创建索引,可以有效提高查询效率。比如 select * from t1 straight_join t2 on (t1.a=t2.a) where t1.b = 'xxxx';
t2 的字段 a 上有索引,查询过程会是先从表 1 中依次取出满足条件的行数据,之后用行数据中的 a 字段去 t2 上匹配后将两表字段拼接返回,此时能使用到 t2.a 的索引,避免了 t2 全表扫描。
如果 select 字段 + where 字段字段列数不太多且查询频繁时,可以考虑为 select 和 where 字段创建联合索引,避免查询时回表,提高查询效率。比如 select a from t where b = ‘xx’
, 创建联合索引 (b, a), 此时扫描索引树后,就已经得到需要查询的字段 a 了,不需要再回表。需要注意的是联合索引字段的顺序,这个语句无法使用到索引 (a, b)。
a = 1 and b = 2 and c > 3 and d = 4
, 如果建立 (a,b,c,d) 顺序的索引,d 是用不到索引的。字段是否用到索引的意思是字段是否能利用字段在索引中的有序性进行快速过滤。索引 (a,b,c,d), 在索引树上是先按 a 进行排序,再按 b 进行排序,以此类推,排序规则类似 order by a,b,c,d
。上面查询条件中,a 定值,b 是有序的;b 定值,c 是有序的;c 范围查询,剩下的 d 是无序的。所以 d 无法使用到该索引。a=1 or b = 2
, 只有当 a 和 b 都有索引才能使用到索引。Mysql 设计的使用场景比较广泛,需要对遍历查询、单条查询、数据更新都需要较好的性能支持。B + 树的特性是只在叶子节点上存储数据。可以从数据读写方面与哈希表、有序数组、b 树其他几种索引模型进行比较:
可以考虑先删掉表的索引,等删除数据后再重建索引。当我们在进行数据修改时,需要同时修改索引,这些额外的索引维护成本较低数据修改的效率;同时,大量的数据删除会导致索引数据页产生大量的碎片空间,此时删除数据后重建索引可以使索引树更 “紧凑”,提高磁盘空间利用率。
数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。
可以利用 explain 查看 sql 语句的执行计划,通过执行计划来分析索引使用情况。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有