UNION查询索引?

时间:2009-10-12 14:18:26

标签: mysql indexing union

我有这个联合查询:

(SELECT INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT FROM ACCOUNTS 
WHERE INSTALLDATE = '$date' && FUNDINGSTATUS !='DEAD') 
UNION 
(SELECT technician, servicetime, result, ID, Customername, address, city, state, zip, notes, board, priority, '', '', '', '', '', '' FROM service 
WHERE serviceday = '$date') 
ORDER BY INSTALLER, priority

我很好奇,如果在日期字段上添加索引有助于加快查询速度吗?或者我在第一个where子句中使用FUNDINGSTATUS的事实会使该查询不使用索引吗?

3 个答案:

答案 0 :(得分:3)

最有可能它会有所帮助,但唯一可以确定的方法是打开探查器并查看。从版本5.0.37开始,MySQL有一个内置的profiler

使用

启用它
set profiling=1;

查找query_id

show profiles;

要查看执行计划:

show profile for query x;

答案 1 :(得分:2)

回答你的问题:

  

我很好奇,如果在日期字段上添加索引有助于加快查询速度吗?

如果installdateserviceday上的条件是选择性(即几行满足它),那么是的,它会有所帮助。

日期字段通常倾向于选择性。

  

或者我在第一个where子句中使用FUNDINGSTATUS的事实是否会使该查询不使用索引?

是的,仍然会使用索引。

引擎将使用索引仅选择installdate = $date的记录,并且还会对fundingstatus的值进行过滤。

为获得最佳效果,请创建以下索引:

ACCOUNTS  (installdate, fundingstatus)
service (serviceday)

如果DEADfundingstatus的常用值,则最好像这样重写此查询:

SELECT  INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT
FROM    ACCOUNTS 
WHERE   INSTALLDATE = '$date' AND FUNDINGSTATUS < 'DEAD'
UNION ALL
SELECT  INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT
FROM    ACCOUNTS 
WHERE   INSTALLDATE = '$date' AND FUNDINGSTATUS > 'DEAD'
UNION
SELECT  technician, servicetime, result, ID, Customername, address, city, state, zip, notes, board, priority, '', '', '', '', '', ''
FROM    service 
WHERE   serviceday = '$date'
ORDER BY
        INSTALLER, priority

以便可以使用(installdate, fundingstatus)两个字段的范围访问权限。

答案 2 :(得分:0)

在where子句中的任何字段上建立索引总是可以提高性能,无论是很多还是一点点。

回答你是否会使用“日期”索引的问题,尽管第一次查询在where子句中有“FUNDINGSTATUS”有2个答案:

  • 如果表上没有其他索引,那么绝对会使用日期索引。这是因为通过索引查找具有特定日期的记录对于DB来说比搜索整个表要少得多,即使它确实需要在找到所述记录后检查FUNDINGSTATUS。

  • 如果同一个表上还有其他索引,那么答案是“它取决于”。

    这主要取决于数据的百分比是多少,而不是指定日期的数据百分比。

    优化器通常会尝试选择能够立即选择最小列数的索引 - 例如如果你的表有100天的数据,其中1/2是死行,那么将选择日期索引,因为它为你提供1%的数据而不扫描表格而不是50%的数据。