分析一个执行时间很长的sql

背景

在查bug时发现有两个相似sql查询速度相差巨大:

SELECT * FROM news_basic WHERE category =43 AND status in (1,7) AND source in (11,12,13)
  ORDER BY publish_time  DESC    LIMIT 6;

SELECT * FROM news_basic WHERE category =8 AND status in (1,7) AND source in (11,12,13) 
 ORDER BY publish_time  DESC    LIMIT 6;

区别仅在于 category 一个是43,一个是8。(后面方便阐述称第一个sql为Q43,第二个sql为Q8。)
Q43的query速度:0.00347175秒;Q8是21.150秒。

数据库版本:5.6.28

当然,在实际业务中,WHERE status in (1,7) AND source in (11,12,13) 的数据子集的category 取值分布在[10,1000]。所以,Q8的结果集必定是空的,从业务上讲是个不符合业务的sql。

但这两个sql为什么速度差这么多呢?

首先对比下数据库中两个category的记录数,数据量差距并不大。排除两category数据量相差过大造成的影响。

数据库中记录对比

再对比下执行计划 EXPLAIN

很奇怪,两sql的执行计划一致。
查询过程先走publish_time的索引再回表,没有疑问。只是rows估计扫过行数都是24,Q8也这么少吗?


Q8执行计划

Q43执行计划

进行猜测

最后使用show profile 验证一下

  1. 打开profile: set profiling = 1;
  2. 执行两条sql语句
  3. 执行show profiles;
  4. show profile for query N; (这里N=1,2).
    结果如图所示(左侧Q8,右侧Q43)


    左侧Q8,右侧Q43

时间都消耗在sending data上了,执行器耗时巨长。

注:Sending data 并不一定是指“正在发送数据”,而可能是处于执行器过程中的任意阶段.(林晓斌 MySQL实战45讲,33讲)
所以,虽然Q45结果集是空,但sending data仍可能很长。

继续深入下: 执行show profile ALL for query N;
将部分差异明显的内容整理成表格,如下所示:

二者show profile主要的差异对比

结论:

  1. 可以看出,Q8 执行的主要耗时是statistics过程中,此过程中读入了若干block 。
    先进行publish_time 的排序,然后回表根据where做检索。当检索的条数等于limit_count 时,检索停止,返回数据。
    Q8会触发mysql对limit的优化策略mysql5.6官方对limit的优化。所以在筛选到6条记录后进行返回了。
  2. Q43先通过publisth_time进行排序,然后全表检索,Q43每条记录都不符合where的限定条件。耗时都在sending data阶段。【为什么不是execting阶段?】
    该过程block_ops_in 高达1733k。后文估计了表内所有数据大约占 239k个block,这个数字远小于1733k,显然是有重复读入的。

仍存的疑问:

  1. 官方对block_ops 解释过于简单,有没有更详细的说法。

  2. 为什么block_ops_in会重复读入,与耗时成正比呢?对block_ops 的


    两次执行Q8的对比

    当然,表格标黄处都与query耗时成正比,时间越长,cpu时间 上下文切换肯定会越高的。

  3. 为什么Q8会有block_ops_out?
    官网对block_ops_in 和block_ops_out的解释
    The number of block input and output operations.
    ops是operation per second吗?

  4. execting和sending data的区别。


估算表内数据占多少block

page 和 block 是一个概念。库中pagesize是默认值 16384,也就是16k。news_basic表数据所占共3.65GB。

数据长度

很粗略地估计一下(如果表中有长字段,那么每行的size会更小,实际页数会更少)。

其他的发现

navicat的“概况”

navicat在执行完一批次查询后有个“概况”标签,与show profile类似,但是实际结果二者不太相同。
navicat会执行sql进行统计:

SELECT STATE AS `Status`, ROUND(SUM(DURATION),7) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/0.002964*100,3), '') AS `Percentage` 
FROM INFORMATION_SCHEMA.PROFILING 
WHERE QUERY_ID=102 
GROUP BY SEQ, STATE 
ORDER BY SEQ

navicat分析Q8,大量的时间在execting下,sending data 会很小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 分析SQL执行带来的开销是优化SQL的重要手段。在MySQL数据库中,可以通过配置profiling参数来启用SQ...
    张伟科阅读 1,058评论 0 1
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,166评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,133评论 0 12
  • 劳累一天的鸟,睡了 雄鸟在巢边的枝上守护,警惕 雌鸟在巢里低垂扇面的翅膀 裹胸几个雏鸟的低鸣,并非寒冷 头钻出母亲...
    忠志_3d7b阅读 190评论 1 2