Отвечая на ваш вопрос:
Мне любопытно, поможет ли указание индекса в поле даты ускорить оба запроса?
Если условие для installdate
и serviceday
является селективным (то есть удовлетворяет несколько строк), тогда да, это поможет.
Поля даты обычно имеют тенденцию быть выборочными.
или тот факт, что я использую FUNDINGSTATUS
в первом предложении where, заставит этот запрос не использовать индекс?
Да, индекс все еще будет использоваться.
Движок будет использовать индекс для выбора только записей с 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)
.