【问题标题】:What is optimized way: having a sort_union or having 2 different queries?什么是优化方式:有一个 sort_union 还是有 2 个不同的查询?
【发布时间】:2013-09-11 10:00:28
【问题描述】:

我有一个正在尝试优化的后续查询,因为表中有数百万个数据。我尝试了 MySql Explain 但没有获得执行查询的优化方式:

SELECT * FROM tbl 
WHERE (SEND ='abc' AND TYPE IN ('A', 'D') and FLAG !='Y') 
       OR (REC ='abc' AND TYPE = 'I' and FLAG !='Y') 

这个查询使用 index_merge 和 sort_union() 因为我有以下两个索引:
1。在 SEND 和 REC 上
2。录制时

我尝试使用两个不同的查询而不是两次访问服务器,而不是上面使用 ref 类型的查询。

SELECT * FROM tbl 
WHERE SEND ='abc' AND TYPE IN ('A', 'D') and FLAG !='Y'


还有

SELECT * FROM tbl 
WHERE REC ='abc' AND TYPE = 'I' and FLAG !='Y'

由于数据太大我无法得出结论,请告诉我上述两个优化查询或更好的方法。

谢谢!!

【问题讨论】:

    标签: mysql sql query-optimization sql-execution-plan


    【解决方案1】:

    看!优化所有查询是不可能的,只要坚持基础

    1.在Where条件中的所有列上放置索引。

    2. 正确选择数据类型,例如,如果您确定(并且更改结构在您手中),则为 COLUMN TYPE 选择 CHAR(1)。

    更多在这里你是硬编码的值,所以没有太多可以完成的地方

    【讨论】:

    • 我的 TYPE 和 FLAG 都是 char(1)。那么您建议使用 sort_union 进行单个查询比使用两个不同的查询更好吗?
    • 确实!我想知道上述查询需要多少时间?
    • 还有您正在处理的确切数据量!
    • ~25M 基数,大约需要 0.4 秒
    【解决方案2】:

    最佳查询将使用两个索引,然后将结果放在一起 没有排序。使用union 进行重复删除需要排序。这反过来又是必要的,因为有些记录可能同时满足这两个条件。

    以下版本应为每个组件使用每个索引。第二个被稍微改写以避免与第一个重复:

    SELECT *
    FROM tbl 
    WHERE (SEND = 'abc' AND TYPE IN ('A', 'D') and FLAG !='Y')
    union all
    SELECT *
    FROM tbl
    WHERE (REC = 'abc' AND TYPE = 'I' and FLAG !='Y' and SEND <> 'abc');
    

    顺便说一句,将TYPE, FLAG 添加到您的索引将进一步提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2012-09-17
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      相关资源
      最近更新 更多