MySQL索引常见问题

专栏持续更新中:MySQL详解

问题1:用联合索引优化using filesort

首先,要给userid加索引(一般过滤条件的字段需要加索引),此时创建的是二级索引树,select *涉及回表。而且还有order by addtime,如果addtime没有建索引的话,explain分析时会出现using filesort,涉及addtime的文件排序!

我们可以添加联合索引(多列索引):userid+addtime

这样的话,在二级索引树上用userid过滤出来的数据中,addtime就已经是有序的了

addtime不建立索引,就有using filesort,数据的外排序。用userid选择出来的数据越多,耗费的排序性能差的越大

addTime有索引,那索引树上的数据就是按照addTime排好序的

问题2:给区分度高的字段加索引

比如我们给sex建立索引,而sex就两种,所以用sex过滤出来的数据可能会占到整张表的一大部分,可能不会用到索引

问题3:select的字段会导致回表

如果不需要那么多的字段,就不要select太多,这会导致回表,影响效率。能直接在二级索引树上取的就直接取,避免回表!

问题4:多个字段有索引,使用哪个索引?

一张表的一次查询只能用到1个索引,数据库引擎会比较用a=1过滤的数据和b=2过滤的数据,哪个索引过滤出来的数据少,就用哪个索引

问题5:内连接之大表和小表

内连接的时候,小表是整表扫描,每一个都要用到,大表相关联的字段没有索引的话,小表的每一个uid在大表中搜索都是整表搜索。如果大表相关联的字段有索引,小表的每一个uid在大表中就是走索引,搜的非常快。

确定大表还是小表:先用where进行数据过滤,谁的数据少谁就是小表

问题6:模糊搜索使用索引

第一个zhang%通配符在后面,可以利用索引进行前缀搜索,可以根据前缀的匹配缩小搜索范围。对于字符串类型来说,索引长度(key_len)不需要很长,只需要能区分每个字符串数据即可,索引过长,导致索引文件变大,创建索引树的时候花费的磁盘I/O也就多了

第二个%zhang%通配符在前面,可以匹配任意的数据,所以只能整张表搜索。如果不扫描完整张表,也不知道到底还有没有含有zhang的数据

问题7:in和not in是否能用到索引?not in优化成range范围搜索

实际上,MySQL做了如下优化:

csharp 复制代码
select age from student where age not in (20);
select age from student where age < 20 or age > 20;  -- 优化成了range范围搜索

not in 可以转化为范围range搜索查询

问题8:索引字段涉及函数以及类型转换,无法用到索引

本来是按照password排序作为索引的,经过函数计算之后就成为了另外的值,所以无法使用索引

索引字段涉及类型强转、mysql聚合函数调用、表达式计算等,不会使用索引

问题9:or不能使用索引?

or 实际上也可以用到索引,MySQL会对or进行优化成union联合查询

优化成union后的两个select应该是都可以使用索引的,究竟用不用,还得看使用索引是否能带来效率的提升

总结

相关推荐
Raink老师5 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
●VON5 小时前
鸿蒙Flutter实战:分类管理页BottomSheet CRUD
数据库·flutter·华为·harmonyos·鸿蒙
Cosolar5 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
明月_清风5 小时前
加密解密系统完全指南:原理剖析与 Go 实践
后端
企服AI产品测评局6 小时前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
cfm_29146 小时前
Redis数据安全性解析
数据库·redis·缓存
DIY源码阁6 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
冬奇Lab7 小时前
每日一个开源项目(第105篇):Twenty - 跳出 Salesforce 的圈套,定义现代开源 CRM
前端·后端·开源
NiceCloud喜云8 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书