上一次在面试官:来说说MySQL的常见优化方案……中说到 MySQL 性能优化的方案很多,因此它可以全面地考查一个程序员的经验是否丰富。
当然对于这个问题的回答也是可深可浅,不同的岗位对此问题的要求也是不同的。MySQL 可以引申出更多的面试问题,比如:联合索引需要注意什么问题?
如何排查慢查询?
正确使用联合索引
使用了 B+ 树的 MySQL 数据库引擎,比如 InnoDB 引擎,在每次查询复合字段时是从左往右匹配数据的,因此在创建联合索引的时候需要注意索引创建的顺序。
例如,我们创建了一个联合索引是 idx(name,age,sex),那么当我们使用 姓名+年龄+性别、姓名+年龄、姓名 等这种最左前缀查询条件时,就会触发联合索引进行查询;然而如果非最左匹配的查询条件,例如 性别+姓名 这种查询条件就不会触发联合索引。
当然,当我们已经有了(name,age) 这个联合索引之后,一般情况下就不需要在 name 字段单独创建索引了,这样就可以少维护一个索引。
慢查询
慢查询通常的排查手段是先使用慢查询日志功能,查询出比较慢的 SQL 语句,然后再通过 explain 来查询 SQL 语句的执行计划,最后分析并定位出问题的根源,再进行处理。
慢查询日志指的是在 MySQL 中可以通过配置来开启慢查询日志的记录功能,超过 long_query_time 值的 SQL 将会被记录在日志中。我们可以通过设置 slow_query_log=1 来开启慢查询,它的开启方式有两种:通过 MySQL 命令行的模式进行开启,只需要执行 set global slow_query_log=1 即可,然而这种配置模式再重启 MySQL 服务之后就会失效;
通过修改 MySQL 配置文件的方式进行开启,我们需要配置 my.cnf 中的 slow_query_log=1,并且可以通过设置 slow_query_log_file=/tmp/mysql_slow.log 来配置慢查询日志的存储目录,但这种方式配置完成之后需要重启 MySQL 服务器才可生效。需要注意的是:在开启慢日志功能之后,MySQL 的性能会受到一定影响,因此在生产环境中要慎用此功能。
explain 执行计划的使用示例 SQL 如下:
explain select * from person where uname = 'Java';
它的执行结果如下图:
摘要说明如下表:
以上字段中最重要的就是 type 字段,它的所有值如下所示:
当 type 为 all 时,则表示全表扫描,因此效率会比较低。
此时需要查看一下为什么会造成此种原因,是没有创建索引,还是创建的索引有问题?以此来优化整个 MySQL 运行的速度。
推荐阅读:
本文首发于公号 勾勾的Java宇宙
欢迎来找勾勾聊天哦~
博客围绕MySQL性能优化展开,提到其可全面考查程序员经验,还引申出联合索引注意事项、慢查询排查等面试问题。介绍了创建联合索引要注意顺序,以及慢查询的排查手段,包括开启慢查询日志和使用explain执行计划,同时提醒开启慢日志会影响性能。
2026

被折叠的 条评论
为什么被折叠?



