CBO基于成本优化 RBO基于规则优化
执行计划优化
explain关键字需要注意的几个列:
select type 查询类型
type 至少是范围查询range
possible key:可能用到的索引列
key:实际用到的索引列
key_len:所用到的索引长度
rows和filtered都是预估值
using indexi condition表示使用到了索引下推
索引优化
索引面试常问:索引分类 索引数据结构 索引数据结构的选择 回表 最左匹配 索引下推 索引优化 索引失效 聚簇索引和非聚簇索引 存储引擎
最左匹配原则:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
查询计划
优化小细节:
1.当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而而不是数据库
2.尽量使用主键查询,而不是其他索引,因为不会回表
3.使用前缀索引
4.union all in or都会使用索引,但是推荐使用in
5.范围列可以用到索引 索引最多用于一个范围列
6.转换会索引失效
7.更新十分频繁得 数据区分度不高的字段不宜建索引
8.能用limit就用limit
9.单表索引尽量控制在5个以内
10.组合索引尽量不要超过5个
count()和count(1)和count(列名)的区别
count(1)和count()之间没有区别,因为count(*)count(1)都不会去过滤空值,
但count(列名)就有区别了,因为count(列名)会去过滤空值。
count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。**