暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL性能优化:如何搞定联合索引和慢查询?

勾勾的Java宇宙 2021-04-20
1695

上一次在面试官:来说说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
 来开启慢查询,它的开启方式有两种:

  1. 通过 MySQL 命令行的模式进行开启,只需要执行 set global slow_query_log=1
     即可,然而这种配置模式再重启 MySQL 服务之后就会失效;

  2. 通过修改 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的常见优化方案……

双十二预热中,讲讲Redis如何助力秒杀业务

不知道缓冲区优化操作,你还想搞Java性能优化?

JVM 对锁做了什么优化?


文章转载自勾勾的Java宇宙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论