1.SQL优化
SQL定位执行效率慢的sql语句
1.命令:show Status like ,通过这条命令可以知道数据库是以查询为主还是更新为主,
那个多就优化那个操作
2.explain+sql语句查询sql执行过程,得到这些信息:
a:哪些步骤花费的成本比较高
b:哪些步骤产生的数据量多,数据量的多少用线条的粗细表示,很直观
c:sql语句是否走索引
3.show profile 分析SQL语句,可以查看所有sql语句的执行效率(执行时间),前提是这个命令需要被打开
4.慢查询日志(常用的工具)
慢查询日志记录了所有执行时间错过参数long_query_time的sql语句的日志,参数默认为10秒(可以通过配置文件设置),日志保存在/var/lib/mysql/目录下,有个slow_quey.log文件。
2.explain功能
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
3.sql语句调优
1.根据业务场景建立复合索引只查询所需要的业务字段,这些字段被索引覆盖将极大的提升查询效率
2.多表连接的字段上需要建立索引,极大的提高表连接的效率
3.where条件字段上需要建立索引,但where条件上不要使用运算函数,避免索引失效
4.排序字段上,因为排序效率低,添加索引能提高效率
5.优化insert语句:批量插入数据比单个插入数据效率高
6.优化order by语句,在使用 order by 语句时不要使用select * ,select后面要查有索引的列,如果一条语句对多个列进行排序,在业务允许的情况下,同时排序或降序
7.优化group by语句:在我们对某一个字段进行分组的时候,mysql默认是帮我们排序的,但是排序又不是我们业务所必须的,额外的排序会降低效率,所以可以禁止排序,order by null。
8.尽量避免子查询,可以将子查询优化为join多表连接查询
9.合理的数据库设计
4.合理的数据库设计
根据数据库三范式进行表结构的设计。设计表结构时,就需要考虑如何设计更有效的查询,
遵循数据库三范式。
第一范式:数据表中的每个字段都是不可拆分的最小单元,确保每一列的原子性
第二范式:满足第一范式后,表中每一列必须有唯一性,都必须依赖主键
第三范式:满足第二范式后,表中每一列只与主键直接相关,而不是间接相关,字段没有冗余。
没有最好的设计,只有最合适的设计,不要过分注重理论。三范式作为一个基本依据
有时候可以根据场景合理的反规范化