目录
- 一、MySQL性能分析工具
- 二、MySQL性能优化常见问题
- SQL 优化步骤
- MySQL优化
- 数据库优化
- MySQL怎么优化全表扫描(table scan)
- MySQL 如何优化 DISTINCT
一、MySQL性能分析工具
数据库性能低时,优化过程应该从下往上考虑。
几种常用的性能分析工具:
- 查看系统性能参数
使用SHOW STATUS
语句查询一些 MySQL 数据库服务器的性能参数和执行频率。 - 统计SQL的查询成本
使用 SQL 语句SHOW STATUS LIKE 'last_query_cost';
查看上一条 SQL 语句的成本。 - 慢查询日志
使用SQL语句set global slow_query_log='ON';
开启慢查询日志。
使用慢查询分析工具 mysqldumpslow。 - 查看SQL执行成本
使用SQL语句show profiles;
查看 SQL 执行成本。 - EXPLAIN
在 SQL 语句前加一个EXPLAIN
,运行即可。 - 分析优化器执行计划
使用SQL语句select * from information_schema.optimizer_trace\G
查看优化器执行计划。 - MySQL监控分析视图
使用MySQL监控分析视图 sys schema。
二、MySQL性能优化常见问题
SQL 优化步骤
- 用
show status
命令了解各种 SQL 的执行频率。 - 定位执行效率较低的 SQL 语句。
- 通过
Explain
分析较低 SQL 的执行计划 - 通过
show profile
分析 SQL。 - 通过
trace
分析优化器如何选择执行计划。 - 确定问题并采取相应的优化措施。
MySQL优化
- SQL语句如何优化:
Explain
,看是否用了索引,如果没有进行索引优化、索引覆盖、索引下推。 - 大表数据如何优化: (1)禁止不带限制条件的查询语句。(2)主从读写分离。(3)垂直拆分(分布式系统)、水平拆分。
- 超大分页如何优化: (1)
SELECT * FROM xxx WHERE xxx > 20 LIMIT 100000, 10
会白加载100000条数据,可以改成SELECT * FROM xxx WHERE id IN (SELECT id FROM xxx WHERE xxx > 20 LIMIT 100000, 10)
,这样用上了索引,快很多。(2)用Redis。 - 慢查询怎么优化: (1)看是不是加载了多余的行。(2)看是不是没用上索引。(3)都不行就横向、纵向分表。
- 查询过程中的数据访问如何优化:
Explain
,看是否用了索引,如果没有进行索引优化、索引覆盖、索引下推。 - 关联查询如何优化: (1)确保
ON
和USING
的子句中用上了索引。(2)确保GROUP BY
和ORDER BY
只用一个字段,这样才能用上索引。 - 数据库结构如何优化: 空间换时间(1)反范式化,用冗余字段换时间。(2)表里使用频率低的字段分离出去。(3)经常
JOIN
的表建一个中间表。 - CPU 负载过高如何优化: 可能突然有大量 session 进来,分析原因,限制连接数。】
数据库优化
- 外键约束可能严重影响性能,甚至引起“数据库风暴”,如无必要不使用外键。
- 索引优化(适合情况、不适合情况、失效情况、覆盖、下推)
- 关联查询优化
- 大表优化
-
UNION ALL
要比UNION
快很多,因为UNION ALL
不用排序,所以如果不需要排序,就使用UNION ALL
。
MySQL怎么优化全表扫描(table scan)
避免 7 种索引失效的情况。
MySQL 如何优化 DISTINCT
将DISTINCT
在所有列上转换为GROUP BY
,并与ORDER BY
子句结合使用。