2

我有这个联合查询:

(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 的事实会使该查询不使用索引?

4

3 回答 3

3

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

启用它

set profiling=1;

查找 query_id

show profiles;

并查看执行计划:

show profile for query x;
于 2009-10-12T14:30:03.607 回答
2

回答你的问题:

我很好奇在日期字段上放置索引是否有助于加快这两个查询?

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

日期字段通常具有选择性。

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

是的,该索引仍将被使用。

引擎将使用索引仅选择具有 的记录,installdate = $date并将另外过滤 的值fundingstatus

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

ACCOUNTS  (installdate, fundingstatus)
service (serviceday)

如果DEAD是 的频繁值fundingstatus,则最好像这样重写此查询:

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)可以使用两个字段的范围访问。

于 2009-10-12T14:32:07.393 回答
0

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

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

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

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

    这主要取决于给定日期的未读取数据的百分比与数据的百分比。

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

于 2009-10-12T14:49:25.597 回答