目录
MySQL优化
慢查询
如何定位慢查询?
如何分析慢查询?
MySQL优化
MySQL 优化是数据库管理和应用性能调优的一个重要方面。以下是一些常规性的 MySQL 优化经验和适用场景:
-
索引优化:
-
确保表的字段上有适当的索引,以加速查询。
-
使用覆盖索引,以减少对表的实际访问次数。
-
避免在列上使用通配符前缀,因为它会阻止使用索引。
-
-
查询优化:
-
尽量避免使用
SELECT *
,只选择实际需要的列。 -
使用合适的 WHERE 子句,以减少检索的行数。
-
避免在查询中使用
SELECT DISTINCT
,除非确实需要。
-
-
表设计优化:
-
使用适当的数据类型,避免使用过大的数据类型,以减小存储和提高检索效率。
-
规范化数据库,以减少冗余数据,提高数据的一致性。
-
使用分区表,将大表分割成更小的逻辑部分,加速查询。
-
-
缓存优化:
-
使用缓存,例如 MySQL Query Cache 或者外部缓存,减少对数据库的实际查询。
-
使用合适的缓存策略,例如最近最少使用 (LRU) 策略。
-
-
配置调整:
-
调整 MySQL 的配置参数,包括缓冲池大小、连接数等,以适应你的应用需求。
-
定期检查和优化表,使用
OPTIMIZE TABLE
命令。
-
-
分表分库:
-
当表变得非常大时,考虑将其分割成更小的表,甚至分散到不同的数据库中。
-
使用分库分表可以提高查询性能和负载均衡。
-
-
合理使用事务:
-
使用合适的事务隔离级别,避免不必要的锁定和阻塞。
-
考虑将一些读操作放在只读事务中,以提高并发性能。
-
-
定期备份和优化:
-
定期备份数据库,以防止数据丢失。
-
定期执行
ANALYZE TABLE
和CHECK TABLE
,以修复可能存在的表问题。
-
-
监控和分析:
-
使用 MySQL 的性能监控工具,例如 Performance Schema 和 slow query log,以识别慢查询和性能问题。
-
使用工具分析数据库的瓶颈,并采取相应的优化措施。
-
-
合理使用缓存:
-
对于读密集型应用,可以考虑使用缓存来存储频繁读取的数据,减轻数据库的压力。
-
慢查询
实际项目中,关于SQL优化的问题最常见的场景就是慢查询了。
慢查询的内部原因可以大致归纳为以下几个方面:
-
聚合查询(优化子查询)
-
多表查询(优化表数据结构设计)
-
数据量过大(使用临时表)
-
深度分页查询(优化分页设计方案)
慢查询的表象:
-
页面加载过慢
-
接口压测响应时间过长(超过1s)
-
链路监控告警(sql执行时间超过2s)
如何定位慢查询?
-
开源工具
-
调试工具:Arthas
-
运维工具:Prometheus、Skywalking(公司内部可能会通过整合开源工具实现自定义的链路监控工具)
-
-
Mysql自带慢查询日志
在 MySQL 的配置文件中(通常是
my.cnf
或my.ini
),确保慢查询日志已经启用。配置如下:slow_query_log = 1 slow_query_log_file = /path/to/slow-query.log long_query_time = 2 # 将查询时间的阈值设置为适当的值,单位是秒
开启慢查询日志配置会影响MySQL性能,所以用于调试阶段,不会在生产环境配置。
-
使用 MySQL Workbench
MySQL Workbench 提供了一个 Performance Dashboard,可以帮助你分析和诊断慢查询。在 MySQL Workbench 中,选择 "Performance",然后选择 "Dashboard"。你可以查看慢查询日志,并使用工具提供的图形化界面进行分析。
如何分析慢查询?
根据工具和日志我们可以得到慢SQL语句,那么如何分析呢?
1.拿来即用的EXPLAIN,分析执行计划
对于复杂的慢查询,你可以查看执行计划以了解 MySQL 是如何执行查询的。可以使用 EXPLAIN
关键字来获取查询计划。使用方式:explain + 慢查询语句。
explain select * from tb_hotel;
EXPLAIN SELECT * FROM tb_hotel WHERE id = "38609";
-
type 查看sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all (一般允许到range,如果是index和all就必然要优化了) system:查询系统中的表 const:根据主键查询 eq_ref:主键索引查询或唯一索引查询 ref:索引查询 range:范围查询 index:索引树扫描 all:全盘扫描
-
possible_keys、key、key_len确认语句中命中的索引是否存在失效的情况
-
Extra额外的优化建议,如果是“using index condition”,有优化索引的空间
2.检查索引
确保查询中使用的字段上有适当的索引。使用 SHOW INDEX FROM your_table
查看表的索引情况,确保索引被正确使用。
3.使用第三方查询优化工具
如 MySQL Workbench、Navicat 等,提供了可视化的查询分析功能,能够帮助你更直观地了解查询的性能特征。