我有这个联合查询:
(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的事实会使该查询不使用索引吗?
答案 0 :(得分:3)
最有可能它会有所帮助,但唯一可以确定的方法是打开探查器并查看。从版本5.0.37开始,MySQL有一个内置的profiler。
使用
启用它set profiling=1;
查找query_id
show profiles;
要查看执行计划:
show profile for query x;
答案 1 :(得分:2)
回答你的问题:
我很好奇,如果在日期字段上添加索引有助于加快查询速度吗?
如果installdate
和serviceday
上的条件是选择性(即几行满足它),那么是的,它会有所帮助。
日期字段通常倾向于选择性。
或者我在第一个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)
两个字段的范围访问权限。
答案 2 :(得分:0)
在where子句中的任何字段上建立索引总是可以提高性能,无论是很多还是一点点。
回答你是否会使用“日期”索引的问题,尽管第一次查询在where子句中有“FUNDINGSTATUS”有2个答案:
如果表上没有其他索引,那么绝对会使用日期索引。这是因为通过索引查找具有特定日期的记录对于DB来说比搜索整个表要少得多,即使它确实需要在找到所述记录后检查FUNDINGSTATUS。
如果同一个表上还有其他索引,那么答案是“它取决于”。
这主要取决于数据的百分比是多少,而不是指定日期的数据百分比。
优化器通常会尝试选择能够立即选择最小列数的索引 - 例如如果你的表有100天的数据,其中1/2是死行,那么将选择日期索引,因为它为你提供1%的数据而不扫描表格而不是50%的数据。