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

Model data yang efisien untuk kueri rentang

Sebenarnya, kunci utama Anda tidak masuk akal dalam hal kueri rentang seperti itu. Ini hanya menunjukkan pasangan unik untuk <from_ip, to_ip> tuple - dengan demikian, MySQL tidak akan dapat menggunakan indeks itu dengan perbandingan rentang seperti itu.

Kecuali Anda menjalankan beberapa kueri yang melibatkan kedua bagian kunci utama Anda, itu tidak akan berpengaruh (well, sebenarnya, MySQL juga akan menggunakannya - ketika kondisi pemilihan menggunakan bagian kiri dari indeks gabungan , tapi itu bukan kasus Anda). Misalnya, ini akan menggunakan kunci utama:

-- @x and @y are derived from somewhere else
SELECT * FROM inetnum WHERE [email protected] && [email protected]

Dalam kasus Anda, kunci majemuk mungkin merupakan kunci utama, ya, tetapi satu-satunya manfaat adalah - untuk memberikan keunikan. Jadi, Anda dapat membiarkannya apa adanya, atau membuat id pengganti kunci utama (mengganti kunci utama saat ini dengan UNIQUE paksaan).

Salah satu solusi yang mungkin untuk memperbaiki situasi adalah - buat kunci satu kolom untuk from_ip dan to_ip . Karena mereka bilangan bulat, ada peluang bagus untuk kardinalitas tinggi, yang akan dimiliki indeks hasil. Namun, MySQL hanya dapat menggunakan satu indeks, dan, oleh karena itu, Anda akan kehilangan 'setengah' dari perbandingan efisien rentang. Anda juga harus ingat, bahwa jika perbandingan lebih besar (atau kurang dari) akan memengaruhi terlalu banyak baris, MySQL akan tidak menggunakan indeks juga (karena, jelas, tidak masuk akal karena ada terlalu banyak baris untuk dipilih).

Dan - ya, hindari menggunakan fungsi di WHERE ayat. Saya tidak mengatakan bahwa MySQL akan selalu kehilangan penggunaan indeks dalam kasus seperti itu (tetapi kemungkinan besar, itu akan kehilangannya dalam banyak kasus) - tetapi pikirkan tentang overhead yang akan menyebabkan panggilan fungsi. Meskipun kecil - Anda selalu dapat membuangnya dengan memberikan nilai yang benar, yang dibentuk oleh aplikasi Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Format Baris MySQL:Perbedaan antara tetap dan dinamis?

  2. Perbarui MySQL dari CSV menggunakan JAVA

  3. Pindahkan simpul dalam kumpulan bersarang

  4. Docker Laravel Mysql:tidak dapat menemukan driver

  5. Apakah ada cara untuk menanyakan apakah bidang array berisi nilai tertentu di Doctrine2?