Mysql
 sql >> база данни >  >> RDS >> Mysql

Как трябва да направя индексиране за заявка с две условия за диапазон?

IN е нещо като между = и "диапазон". Така че се заяждам със заглавието на въпроса. Два диапазона е практически невъзможно да се оптимизират; IN плюс диапазон има някакъв шанс за оптимизиране.

Въз основа на

WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)  
AND   `StartedAt` <  FROM_UNIXTIME(1518998400) 
AND `DeviceId` IN (
    UNHEX('00030000000000000000000000000000'),
    UNHEX('000300000000000000000000000181cd'),
    UNHEX('000300000000000000000000000e7cf6'),
    UNHEX('000300000000000000000000000e7cf7'),
    UNHEX('000300000000000000000000000f423f')
) AND `MarkedForDeletion` = FALSE

Бих предоставил 2 индекса и бих оставил оптимизатора да реши кой да използва:

INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)

Някои по-нови версии на MySQL/MariaDB могат да надскочат и да използват всичките 3 колони в втората индекс. Във всички версии първите 2 колони на всеки индекс го правят кандидат. Изборът може да се ръководи от статистически данни и може (или не) да е „правилният“ избор.

Тъй като AlarmId не може да бъде NULL , използвайте шаблона:COUNT(*) .

След като направя тази промяна, всеки от моите индекси "покрива", като по този начин дава допълнителен тласък на производителността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхранени функции в MySQL – имена на таблици и колони на динамични/променливи

  2. Добавете бутон за изтриване към таблицата с резултати на PHP

  3. mysql заявка:SELECT DISTINCT колона1, GROUP BY колона2

  4. PHP PDO заявка за динамично актуализиране към MYSQL

  5. Как да разрешите клаузата ORDER BY не е в списъка SELECT, причинено от MySQL 5.7 с SELECT DISTINCT и ORDER BY