where查询太慢
覆盖索引通过取消回表操作,提升查询效率
有更合适的索引不走怎么办?
mysql在选取索引时,会估算索引有多少种
通过选取几个页取平均值,再乘以页的数量来估算
这个估算值叫cardinality
cardinality越大,区分度越大,越好
如果估计错了,我们可以强制使用别别的索引force index
也可以重新优化估计
analye table
count慢怎么办?
用来统计不为null的数据个数
过程
count(非索引字段)
首先要扫面全表,拿出来,再解析出没有null的数据,效率很低
count(索引字段)
count(主键)也其实得判断null,没优化
count(1)
count(*)
order by慢怎么办
原理
中间结果集
中间结果集比较小,可以直接在内存中排序
回表生成完整结果集
中间表是一个临时表,不能走索引
最高效–索引覆盖
where条件和order条件走的一个条件
筛选字段,where字段,order字段都被索引覆盖,这样最好
随机选取慢怎么办
order by rand()原理:随机输出
select title ,description from film order by rand() limit 1;
随机的输出一个
为什么慢
sql执行过程中出现两次中间结果,都是全长度的
仅需要一个随机结果,却经历了不必要的排序
调用了很多次rand()
大头大哥丢了怎么办
索引下推
using index condition
是自动开启的
松散索引扫描
usingindex for skip scan
明明有索引,就是不走怎么办
字符串与数字比较
隐式字符编码转换
分页查询慢怎么办
偏移量大时,效率低
优化思路
想想办法走索引覆盖
得到所需数据的id
根据所需数据的id,得到最终的结果集
慢查询的怀疑方向
1 索引设计有问题
覆盖索引:语句从执行到返回均使用同一个索引,避免回表。通过优化sql语句
2 sql语句有问题
3 数据库选错索引