1

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

请告诉我针对此问题陈述的上述两种优化查询或更好的方法,因为数据太大我无法得出结论。

谢谢!!

4

2 回答 2

0

Look! Optimizing all the queries not possible, Just stick to basics

1.Place index on all the columns in the Where condition.

2.Choose data type properly for example if you are sure (and changing structure is in your hand) then choose CHAR(1) for COLUMN TYPE.

More over here you are hard coded the values in where so not much left that can be done

于 2013-09-11T10:13:12.193 回答
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到您的索引将进一步提高性能。

于 2013-09-11T11:11:41.620 回答