慢查询指的是数据库中执行时辰跨越指定阈值的 SQL 语句。不同行务场景下,这个阈值每每各不换取。在咱们公司里面,这个阈值被设定为 1 秒钟。也即是说,任何执行时辰跨越 1 秒的 SQL 语句齐会被视为慢查询。
对慢查询进行问题排查每每分为以下几个行径:
发现问题一般而言,慢查盘问题相对容易发现。如果有完善的监控体系,系统会如期统计慢 SQL 并通过报警神志教唆。
此外,如果使用了某些数据库中间件,举例 TDDL,它们每每会记载慢 SQL 的日记:
复制
Cause: ERR-CODE: [TDDL-4202][ERR_SQL_QUERY_TIMEOUT] Slow query leads to a timeout exception, please contact DBA to check slow sql. SocketTimout:12000 ms,1.如果只依赖 MySQL 自身的话
找到 MySQL 的建立文献 my.cnf(或者在 Windows 系统下可能是 my.ini),每每它们位于 MySQL 装配目次下的 etc 或 conf 文献夹中。启用慢查询日记功能:请找到以下建立项,并将其取消注目(如果已注目),确保以下行存在或添加到建立文献中:复制
slow_query_log = 1slow_query_log_file = /path/to/slow-query.loglong_query_time = 11.2.3.保存建立文献后,再行开动 MySQL 做事以使建立收效。巡逻慢查询日记:使用文本剪辑器掀开慢查询日记文献。日记文献的旅途每每在建立文献中指定。举例,在 Linux 系统上,不错使用以下号召来巡逻慢查询日记文献:复制
sudo vi /var/log/mysql/mysql-slow.log1.请将旅途 /var/log/mysql/mysql-slow.log 替换为本色建立文献中指定的慢查询日记旅途。建立杀青后,MySQL 会将执行时辰跨越 long_query_time 设立的时辰阈值的 SQL 语句记载到慢查询日记中。
如果有慢 SQL,内容如下:
复制
# Time: 2023-06-04T12:00:00.123456Z# User@Host: hollis[192.168.0.1]:3306# Query_time: 2.345678 Lock_time: 0.012345 Rows_sent: 10 Rows_examined: 100SET timestamp=1650000000;SELECT * FROM orders WHERE status = 'pending' ORDER BY gmt_created DESC;1.2.3.4.5.定位问题在上述各式监控、报警和日记中,咱们不错定位到具体的慢 SQL 语句,然后不错进一步分析为什么这个 SQL 语句执行徐徐,主若是排查以下几个可能的原因:
衰败索引:莫得为查询波及的列创建妥贴的索引,导致数据库需要全表扫描来找到匹配的行。失实使用索引:使用了索引但不妥贴最左前缀原则,或者索引采取度不高(即索引列的惟一性不够高),导致数据库采取不到最优的索引执行查询。查询字段过多:SELECT 语句中波及的字段过多,加多了数据传输和处理的支拨。屡次回表:查询执行经过中需要屡次看望磁盘以获得独特的数据行,举例对主键的索引扫描后,需要再次凭据主键进行查询。多表连结:波及多个表的 JOIN 操作,若 JOIN 要求区分适或者 JOIN 操作莫得应用到索引,会导致性能下落。深度分页:需要复返多半数据中的某一页,可是莫得合适的神志来快速定位和获得这一页数据。其他身分:还有一些其他可能的原因,举例复杂的子查询、数据库做事器负载高、SQL 语句写法欠安等。针对这些问题,不错通过优化数据库表结构、添加合适的索引、优化 SQL 语句写法、休养数据库建立参数等神志来矫正 SQL 查询的性能。
关于大多数情况下的慢 SQL 问题,每每不错通过执行运筹帷幄分析找出根蒂原因,主要网络在索引和 JOIN 操作上。
管制问题定位问题后,管制问题就会变得容易起来。
本色上,最大的挑战不在于管制问题,而在于准细目位问题。因为一朝问题被准细目位,管制起来就变得相对八成。举例,衰败索引就添加索引,JOIN 操作过多就进行拆分。这里不再可贵伸开。