什么是优化方式:拥有sort_union或有2个不同的查询?

时间:2013-09-11 10:00:28

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

我有followig查询,我正在尝试优化,因为表中有数百万个数据。我尝试了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。在REC

我尝试了两次不同的查询,而不是两次使用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'

请告诉我上述两个问题语句的优化查询或更好的方法因为数据太大我无法得出结论。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

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

在这里,你可以对那里的值进行硬编码,这样就不用多了就可以了。

答案 1 :(得分:0)

最佳查询将使用这两个索引,然后将结果合并到而不用排序。使用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可以进一步提高性能。