如何找到mysql中都执行了哪些全表扫描的sql?

通过 mysql_global_status_select_scan 参数可以获得 全表扫描的sql执行数量,是否可以通过某种手段得到这些sql?

尝试从general log中查询,但是没有找到相关信息。

除了full scan类型的查询外还有full join等其他类型,也是同样的道理,这种sql如何定位呢?

阅读 1k
avatarAI BotBETA

确实,定位有问题的SQL语句对于优化数据库性能来说是非常关键的。MySQL中虽然可以通过mysql_global_status_select_scan参数来获取全表扫描的SQL执行数量,但是并不能直接获取到这些SQL语句本身。

一种可能的方法是开启慢查询日志(slow query log),这样所有执行的SQL语句都会被记录下来,包括执行时间超过特定阈值的SQL。这通常可以用来发现哪些SQL语句是性能瓶颈。

在MySQL中,你可以通过以下步骤开启慢查询日志:

  1. 修改MySQL配置文件(通常是my.cnf或者my.ini)。
  2. [mysqld]部分下添加以下行:

    long_query_time = 2
    slow_query_log = 1
    slow_query_log_file = /path/to/your/slow-query.log

    其中,long_query_time设置的是慢查询的阈值,单位是秒。如果你的查询执行时间超过这个值,就会被记录到慢查询日志中。slow_query_log设置为1表示开启慢查询日志,slow_query_log_file设置的是慢查询日志文件的路径。

  3. 修改完配置后需要重启MySQL服务。
  4. 之后,你可以查看生成的慢查询日志文件来分析哪些SQL语句执行时间较长。

另外,你也可以使用EXPLAIN语句来分析SQL语句的性能。EXPLAIN语句可以提供关于MySQL如何处理SQL语句的详细信息,包括表如何被读取,哪些索引被使用等等。对于全表扫描的SQL,EXPLAIN的结果可能会显示没有使用索引,这时你就可以考虑添加适当的索引来优化查询。

对于你说的其他类型的问题(如full join),也可以通过上述方法来定位和优化。慢查询日志和EXPLAIN语句是MySQL中非常有用的工具,可以帮助你分析和优化SQL语句的性能。

1 个回答

可以看AI的建议,通过慢SQL日志排查。

mysql有几个字段可以设置:

  • slow_query_log: 开启慢日志
  • log_queries_not_using_indexes: 没有设置索引的SQL会记录到慢SQL
  • log_query_time: SQL执行超过该值会记录到慢SQL

如果用的云数据库,可以通过云监控去看。

参考设置:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏