# SQL优化
如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?如何才能知道这条语句执行很慢的原因?
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了
explain
命令来查看语句的执行计划。我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化。对于查询语句,最重要的优化方式就是使用索引。而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。SQL的生命周期
连接器:
建立与MySQL的连接,用于查询SQL语句,判断权限;
查询缓存:
- 如果语句不再查询缓存中,那么就要继续执行后面的执行阶段。执行完成之后,执行结果集会被存入查询缓存中;
- 如果查询命中了缓存,那么MySQL不需要执行后面的复杂操作,可以直接返回结果,提升效率;
分析器:
对SQL语句进行硬解析,分析器会先做词法分析,分析SQL语句的组成部分,判断其是否满足语法规则。
优化器:
优化器的作用是指当表里面有多个索引的时候,决定去使用哪个索引;或者当一个语句有多表关联(join)的时候,决定各个表的连接顺序。其实不同的执行方法的结果是一样的,但是效率会有所不同就,优化器的作用就是决定选择使用哪一个方案。
执行器:
- 有索引:第一次调用的是取满足条件的第一行这个接口,之后循环取满足条件的下一行的这个接口,最终把查询的结果返回客户端;
- 无索引:调用InnoDB引擎接口取这个表的第一行,判断SQL查询条件,如果不是则跳过,如果是则将这行存在结果集中;调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行。最终,执行器将上述遍历过程中所有满足条件的行组成的记录作为结果返回给客户端。
大表的数据查询怎么优化
超大分页怎么处理
MySQL分页
慢查询日志
主键使用自增长ID还是UUID?
优化关联查询
优化LIMIT分页
优化UNION查询
优化WHERE子句
← MySQL