数据库01-慢查询优化

目录

MySQL优化

慢查询

如何定位慢查询?

如何分析慢查询?


数据库01-慢查询优化_第1张图片

MySQL优化

MySQL 优化是数据库管理和应用性能调优的一个重要方面。以下是一些常规性的 MySQL 优化经验和适用场景:

  1. 索引优化

    • 确保表的字段上有适当的索引,以加速查询。

    • 使用覆盖索引,以减少对表的实际访问次数。

    • 避免在列上使用通配符前缀,因为它会阻止使用索引。

  2. 查询优化

    • 尽量避免使用 SELECT *,只选择实际需要的列。

    • 使用合适的 WHERE 子句,以减少检索的行数。

    • 避免在查询中使用 SELECT DISTINCT,除非确实需要。

  3. 表设计优化

    • 使用适当的数据类型,避免使用过大的数据类型,以减小存储和提高检索效率。

    • 规范化数据库,以减少冗余数据,提高数据的一致性。

    • 使用分区表,将大表分割成更小的逻辑部分,加速查询。

  4. 缓存优化

    • 使用缓存,例如 MySQL Query Cache 或者外部缓存,减少对数据库的实际查询。

    • 使用合适的缓存策略,例如最近最少使用 (LRU) 策略。

  5. 配置调整

    • 调整 MySQL 的配置参数,包括缓冲池大小、连接数等,以适应你的应用需求。

    • 定期检查和优化表,使用 OPTIMIZE TABLE 命令。

  6. 分表分库

    • 当表变得非常大时,考虑将其分割成更小的表,甚至分散到不同的数据库中。

    • 使用分库分表可以提高查询性能和负载均衡。

  7. 合理使用事务

    • 使用合适的事务隔离级别,避免不必要的锁定和阻塞。

    • 考虑将一些读操作放在只读事务中,以提高并发性能。

  8. 定期备份和优化

    • 定期备份数据库,以防止数据丢失。

    • 定期执行 ANALYZE TABLECHECK TABLE,以修复可能存在的表问题。

  9. 监控和分析

    • 使用 MySQL 的性能监控工具,例如 Performance Schema 和 slow query log,以识别慢查询和性能问题。

    • 使用工具分析数据库的瓶颈,并采取相应的优化措施。

  10. 合理使用缓存

    • 对于读密集型应用,可以考虑使用缓存来存储频繁读取的数据,减轻数据库的压力。

慢查询

实际项目中,关于SQL优化的问题最常见的场景就是慢查询了。

慢查询的内部原因可以大致归纳为以下几个方面:

  • 聚合查询(优化子查询)

  • 多表查询(优化表数据结构设计)

  • 数据量过大(使用临时表)

  • 深度分页查询(优化分页设计方案)

慢查询的表象:

  • 页面加载过慢

  • 接口压测响应时间过长(超过1s)

  • 链路监控告警(sql执行时间超过2s)

如何定位慢查询?
  1. 开源工具

    • 调试工具:Arthas

    • 运维工具:Prometheus、Skywalking(公司内部可能会通过整合开源工具实现自定义的链路监控工具)

    数据库01-慢查询优化_第2张图片数据库01-慢查询优化_第3张图片
  2. Mysql自带慢查询日志

    在 MySQL 的配置文件中(通常是 my.cnfmy.ini),确保慢查询日志已经启用。配置如下:

    slow_query_log = 1
    slow_query_log_file = /path/to/slow-query.log
    long_query_time = 2 # 将查询时间的阈值设置为适当的值,单位是秒

    开启慢查询日志配置会影响MySQL性能,所以用于调试阶段,不会在生产环境配置。

  3. 使用 MySQL Workbench

    MySQL Workbench 提供了一个 Performance Dashboard,可以帮助你分析和诊断慢查询。在 MySQL Workbench 中,选择 "Performance",然后选择 "Dashboard"。你可以查看慢查询日志,并使用工具提供的图形化界面进行分析。

如何分析慢查询?

根据工具和日志我们可以得到慢SQL语句,那么如何分析呢?

1.拿来即用的EXPLAIN,分析执行计划

对于复杂的慢查询,你可以查看执行计划以了解 MySQL 是如何执行查询的。可以使用 EXPLAIN 关键字来获取查询计划。使用方式:explain + 慢查询语句。

explain select * from tb_hotel;

数据库01-慢查询优化_第4张图片

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 等,提供了可视化的查询分析功能,能够帮助你更直观地了解查询的性能特征。

你可能感兴趣的:(面试攻略,数据库)