如何查询优化
- 优化数据访问,不返回不必要的数据,只返回必要的列(
SELECT id, name
)和必要的行数(LIMIT number
) - 查询尽量覆盖索引,避免回表的发生
- 优化数据存储,较大的字段单独存储在一个表中
- 将复杂的查询拆分成多个简单的查询,因为Mysql的链接时比较轻量级的
- 最好使用自增ID代替OFFSET逻辑查询
- 比较复杂的查询语句最好先使用
EXPLAIN
进行分析一遍 - 如果多个表是完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推。也就是说:选择记录条数最少的表放在最后。
- 如果多个表是有关系的话,将引用最多的表,放在最后,然后依次类推。也就是说:被其他表所引用的表放在最后。
SQL语句执行流程
- 建立连接,权限验证
- 查询缓存,如果命中则直接返回
- 分析器:对 SQL 语句进行分析
- 优化器:对 SQL 查询的逻辑进行优化
- 关联表(join)的顺序可能会变
- outer join可能会变成内连接
- 优化条件表达式, 例如 5=5 AND a>5被简化成a>5
- 优化MAX\MIN, 如果是MAX(索引),那么直接拿B+树的第一条或者最后一条即可。
- 当发现某个查询或者表达式的结果是可以提前计算出来的时候,就会优化成常数
- 索引覆盖,如果只要返回索引列,就不会走到最底层去。
- 子查询优化
- 提前终止查询(例如LIMIT)
- 等值传播: join中可能把左表的where 拿给右表一起用
- IN(1,2,3,4,5,6)这个条件, 并不是简单遍历判断, 会先排序,然后用二分去判断是否存在。
- 执行器:执行查询语句查询结果
范式和反范式
范式和反范式各有利弊,需要根据实际情况权衡。
范式化的目标是尽力减少冗余列,节省空间。
范式化的优点是:
- 减少冗余列,要写的数据就少,写操作的性能提高;
- 检索列数据时,
DISTINCT
或GROUP BY
操作减少。
范式化的缺点是:增加关联查询。
反范式化的目标是适当增加冗余列,以避免关联查询。
反范式化的缺点是:
- 冗余列增多,空间变大,写操作性能下降;
- 检索列数据时,DISTINCT 或 GROUP BY 操作变多;