视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
执行计划中Usingfilesort,Usingtemporary相关语句的优化解决_MySQL
2020-11-09 18:29:30 责编:小采
文档
bitsCN.com


昨天听开发人员提到,相关的彩票网页当中一个页面刷新的很慢,特别是在提取数据的时候,
今天早上一到,便去找开发人员要去相关的也没进行浏览,窥探哪些数据出现了问题,开发人员
使用PHP开发,所以我用IE很容易就可以窥探到哪些sql执行的很慢,比如下;

这个图上列出了,也没中取sql语句的相关执行时间预估比例,以此我可以探查到大概哪些语句会
影响到我们的业务系统!首先看到了有个500,200毫秒的问题,熟话说,打出头鸟,哈哈,优化
也一样,先把大的问题解决了,在来收拾小的问题(小的问题,也有可能受到大问题的干预造成),
于是我便把该语句找出来;如下;

SELECT
a.user_name as username,
a.order_date as ordertime,
a.bonus_value as bonus,
cm.name_1 as lname
FROM
lot_sellform AS a
INNER JOIN
code_mst AS cm ON a.lottery_id = cm.cd AND a.lottery_type = cm.lot_type
WHERE
a.bonus_value > 0
ORDER BY
a.order_date DESC
limit
10

基本上改弄的索引信息都弄到了,但是我在页面中却看到了这样的情况;如图;

看到type类型基本都走了索引,而且extra列内还有using temporary,using filesort,他们用到了
临时表和在文件内进行了排序,才返回出来,这肯定不是按照我们原先设计的最优路线来走的,
而且相关的索引路线都没走上,这里我有查了相关的资料,在官网上,看到如下内容;(我用蓝色
来表名相关的信息)

在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。

即使ORDER BY不确切匹配索引,只要WHERE子句中的所有未使用的索引部分和所有额外的
ORDER BY 列为常数,就可以使用索引。下面的查询使用索引来解决ORDER BY部分:

SELECT * FROM t1

ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1

WHERE key_part1=constant

ORDER BY key_part2;

SELECT * FROM t1

ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1

WHERE key_part1=1

ORDER BY key_part1 DESC, key_part2 DESC;

这几句话严重勾起了我的兴趣,爱好!哈,在排序中,去查看没有进行索引,而且我在日期列上
添加了btree索引了!怎么会没走呢?以下是图信息;

从上图可以看出,排序仍然是在临时表,和文件中进行了,而且type还是ALL比较耗时的操作,
这里我又会想起前面官网中提及到的,key_part1,key_part2这两列,在where语句中,和order by中
出现的比率这么频繁,而且上面说,如果where语句中只要为啥用索引语句列的部分,和所有order by
列的数据如果为常数,可以使用索引路线来走,那如果我对两者来进行彼此的绑定了,比如;让其
来做个组合索引!

首先where条件中bonus_value的值,我们取得是常数,而且在进行排序的时候,我们选择的是
order_date日期的列值,如果彼此来进行绑定组合,sql在选择路线的窥探中首先会尝试,组合索
引中位于第一列的数列,进行handle的锁定,遍历到数值后会继续留住该handle的位于LRU列表
头中,接着继续进行数值的排序遍历结果集合,直到handle列被挤出index维护的元头之外!

其实这个不是让其走我们的bonus_value,order_date索引路径,而且让其走到我们前面INNER JOIN
中的索引路线,避免了让数据在临时表中出现,或者在磁盘文件中排序,其实就是增大了,我们在链接
条件中我们设计索引路线的概率问题!有点声东击西的概念!哈!以下图供参考:

以此看到走了我们需要的索引路径了!

bitsCN.com

下载本文
显示全文
专题