MySql5.7 index merge 有bug

问题背景:
业务代码中, 遇到一个查询莫名奇妙少了一些数据;

  • 通过分析查询,发现用了Mysql index merge特性;
  • 我试图将数据复制到另外表,即使建立了类似的索引,即使查询分析也走了同样的index merge 依然无法重现;
  • 我试图将原表drop表,再重建该表,这个问题依然存在;
  • 发现一个类似的MySql的bug, 已经有很多人报告 https://bugs.mysql.com/bug.php?id=79675 这个bug似乎在MySql8.0中依然可以重现;
  • 还是存在一点区别,bug报告中需要禁用 index_merge_intersection 而我这个case需要禁用 index_merge

将业务代码最简单化抽出来如下:

SELECT
1 as a
FROM
 cty.prmrcmain AS b
WHERE
        b.propertyId IN (
            SELECT
                hId
            FROM
                prmprophistorylord  -- force index (I_prmprophistorylord_hId)
            WHERE
            -- 在cusid 和 hid上分别建立有索引,所以触发了index_merge
                            cusId = 39 and hId = 71 
            --下面的UNION ALL语句也 不可缺少,否则无法触发这个case;
            UNION ALL
            SELECT
                hId
            FROM
                prmprophistorytenant
            WHERE
                 1 != 1
        )

解决方案只好禁用相关特性;
https://dev.mysql.com/doc/refman/5.7/en/switchable-optimizations.html
SELECT @@optimizer_switch\G
SET [GLOBAL|SESSION] optimizer_switch='index_merge=on, index_merge_intersection=off'
目前尚未接到性能问题的报告

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容