上一次在面试官:来说说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 运行的速度。
推荐阅读:





