1.Where 条件查询太慢怎么办(使用explain查询计划去查看)
①覆盖索引
查询语句从执行到返回结果均使用同一个索引,覆盖索引可以有效的减少回表
explain,可以查询sql的执行计划
覆盖索引可以通过取消回表的操作提升查询速度
如果查询用了不止一个字段,则不是覆盖索引
减少使用*的使用,优化联合索引,减少查询不必要的数据
两张表的区别
原表有主键和辅助索引,store_id 和film_id
2.有更合适的索引不走,怎么办
①mysql在选取索引的时候,会参考索引的基数
②基数是mysql估算出来的,反应这种字段有多少取值
③选取几个页算出取值的平均值,在乘以页数,即为基数(选取几个b+树的叶子节点)
基数
mysql在选择索引的时候,会首先考虑索引的区分度,同一条数据,你选取的区分度越大选取的可能性越大
如果估算不对,就要使用强制使用索引,在sql语句后加上 force index
可以让mysql重新估算-优化索引
analyze table 可以重新统计索引信息
根据索引基数,可以判断索引性能的好坏
3.count慢,怎么办
count(非索引字段):无法使用覆盖索引,最慢
count(索引字段):可是使用覆盖索引但依然要取出数据判空
count(1):不需要取出数据,但需要判断“1是否为null”
count(*):经过专门优化,不需要判空,理论最快
4.order by 慢,怎么办
对中间结果集按照ORDER字段排序
SELECT*FROMFIMWHEREFIM_ID>80ORDERBYTITLE
回表生成完整结果集(若需要)
将查询结果放入SORTBUFER
根据WHERE等条件查询
中间结果集
中间表大于SORTBUFFERSIZE时,放在硬盘中
若需要优化排序查询时间,增大SORTBUFFERSIZE
若需要优化内存占用,减小SORTBUFFERSIZE
中间表比较小时,直接放在内存中
回表生成完整结果集
当行小于MAXLENGTH_FOR_SORTDATA时,生成全字段中间表
大于值时,只生成排序字段+主键中间表,需要回表
调大值并不一定改善效率,因为太大的结果集排序效率低
最高效-索引覆盖
索引覆盖可以跳过生成中间结果集,直接输出查询结果
ORDER字段需要有索引(或在联合索引左侧)
其他相关字段(条件,输出)均在上述的索引引中
SELECTFILMID,TITLEFROMFILMORDERBYTITLE
若有收获,就点个赞吧