慢查询日志开启和存储
-
show variables like 'slow_query_log'(查询慢查询日志)
-
set global show_query_log_file='/home/mysql/sql_log/mysql-slow.log'(设置慢查询日志存储位置)
-
set global long_queries_not_using_indexes=on(将未使用索引的sql也记录到慢查询日志)
-
set global long_query_time=1(设置sql超过多少秒记录到慢查询日志)
慢查询日志内容
通过执行计划分析进行sql优化
sql优化
max()
比如一个sql select max(money) from pay,当进行查询时会进行全表扫描查出最大值,但如果我们给 money加一个索引,执行效率就会很快,因为这相当于一个覆盖索引,索引是顺序的,不需要进行扫描查找
count()
count(*) 会将列为空的也计算进去,count(release_year),直接指定哪个字段则不会将为空的列计算进去
子查询优化
通常是将子查询转化为 join 来查询,但要注意数据重复的情况
limit 查询优化
limit通常还会伴随order by 排序,所以在进行order by 排序字段时最好用加索引的字段或者主键
索引优化
如何选择合适的列创建索引
离散度就是指该列的不重复的值的多少,越多离散度越大,在联合索引中就应该放在前面
删除不用的索引和重复的索引
数据库表结构优化
选择合适的数据类型
范式化和反范式化优化
表垂直拆分
表水平拆分
水平拆分是为了解决单表数据量过大的问题,可以通过取模运算进行拆分,每个表的表结构是一样的,由此带来的问题就是查询和后台分析统计问题,可以统计时将表汇总统计,查询就应该考虑具体业务场景进行操作