Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya harus mengindeks kueri dengan dua kondisi rentang?

IN adalah semacam antara = dan 'kisaran'. Jadi, saya berdalih dengan judul pada Pertanyaan. Dua rentang hampir tidak mungkin untuk dioptimalkan; sebuah IN ditambah rentang memiliki beberapa peluang pengoptimalan.

Berdasarkan

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

Saya akan memberikan 2 indeks dan membiarkan Pengoptimal memutuskan mana yang akan digunakan:

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

Beberapa versi MySQL/MariaDB yang lebih baru dapat melompati dan menggunakan ketiga kolom dalam kedua indeks. Di semua versi, 2 kolom pertama dari kedua indeks menjadikannya kandidat. Pilihannya mungkin didorong oleh statistik, dan mungkin (atau mungkin tidak) menjadi pilihan yang 'benar'.

Sejak AlarmId tidak boleh NULL , gunakan pola:COUNT(*) .

Setelah melakukan perubahan itu, setiap indeks saya "menutupi", sehingga memberikan peningkatan kinerja ekstra.



  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 CAST – Cara Mengetik Cast di MySQL

  2. Bagaimana cara menggunakan hashing kata sandi dengan PDO untuk membuat kode saya lebih aman?

  3. Tabel 'performance_schema.session_variables' tidak ada

  4. Haruskah saya menggunakan satu pernyataan SQL Select besar atau beberapa pernyataan kecil?

  5. Bisakah saya membuat Google Drive Spreadsheets bertindak seperti database MySQL?