求解 Mysql 查询产生的 filesort 优化 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
CosWind
V2EX    程序员

求解 Mysql 查询产生的 filesort 优化

  •  
  •   CosWind
    coswind 2014 年 9 月 26 日 4174 次点击
    这是一个创建于 4149 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Mysql两张表联合查询INNER JOIN加上ORDER BY 产生的filesort有解否?
    第 1 条附言    2014 年 9 月 26 日
    那么针对这种无法用索引来优化的查询情况能否用其他方式来优化呢。。
    17 条回复    2014-09-26 13:17:12 +08:00
    incompatible
        1
    incompatible  
       2014 年 9 月 26 日   1
    join的字段和order by的字段加上索引
    CosWind
        2
    CosWind  
    OP
       2014 年 9 月 26 日
    @incompatible 有联合索引,而且是顺序的。不行诶
    CosWind
        3
    CosWind  
    OP
       2014 年 9 月 26 日
    @incompatible INNER JOIN的字段是联合索引的前缀索引
    yangqi
        4
    yangqi  
       2014 年 9 月 26 日   1
    order by的字段是什么类型的, 是否有索引

    另外你explain看一下
    CosWind
        5
    CosWind  
    OP
       2014 年 9 月 26 日
    @yangqi ORDER BY的字段是DATE类型,有和WHERE的条件构成的联合索引
    CosWind
        6
    CosWind  
    OP
       2014 年 9 月 26 日
    @yangqi explain的结果Using where; Using index; Using temporary; Using filesort
    incompatible
        7
    incompatible  
       2014 年 9 月 26 日
    @CosWind 先去掉order by,单独执行join的部分试试,以便推断到底是join和order by里的哪一个导致了filesort
    CosWind
        8
    CosWind  
    OP
       2014 年 9 月 26 日
    @incompatible 单独没问题。
    yangqi
        9
    yangqi  
       2014 年 9 月 26 日
    @CosWind 能把explain贴出来不, 要看的不是这些
    CosWind
        10
    CosWind  
    OP
       2014 年 9 月 26 日
    CosWind
        11
    CosWind  
    OP
       2014 年 9 月 26 日
    CosWind
        12
    CosWind  
    OP
       2014 年 9 月 26 日
    @yangqi http://img.itc.cn/photo/oD1XjXvEUYf 这个,刚那个没截取全
    incompatible
        13
    incompatible  
       2014 年 9 月 26 日
    @CosWind 我做了一个测试 如果where条件中只命中了某字段的一行(比如column = ?),那么对“与该字段构成联合索引的后续列”做order by的话,可以命中索引。 如果where条件中命中了多行(比如用 column
    in (?, ? ...) 的方式),order by时就会引起filesort
    不知你是否是这种情况
    CosWind
        14
    CosWind  
    OP
       2014 年 9 月 26 日
    @incompatible yes,可以说差不多是这个意思。因为我的是INNER JOIN,命中的是很多行
    CosWind
        15
    CosWind  
    OP
       2014 年 9 月 26 日
    @incompatible IN的方式会产生subquery,我用INNER JOIN代替了。
    yangqi
        16
    yangqi  
       2014 年 9 月 26 日   1
    http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html

    这里是官方对于order by使用索引的解释, 估计你的是下面这种情况, 不能用索引

    You are joining many tables, and the columns in the ORDER BY are not all from the first nonconstant table that is used to retrieve rows. (This is the first table in the EXPLAIN output that does not have a const join type.)
    CosWind
        17
    CosWind  
    OP
       2014 年 9 月 26 日
    @yangqi SOGA。非常感谢。难怪我google一直找不到答案。文档也看过了。。没看你这么仔细的说。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2496 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:34 PVG 19:34 LAX 03:34 JFK 06:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86