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

Apakah masuk akal untuk menggunakan indeks yang memiliki kardinalitas rendah?

Sebuah indeks dapat membantu bahkan pada bidang kardinalitas rendah jika:

  1. Ketika salah satu nilai yang mungkin sangat jarang dibandingkan dengan nilai lainnya dan Anda mencarinya.

    Misalnya, ada sangat sedikit wanita buta warna, jadi pertanyaan ini:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    kemungkinan besar akan mendapat manfaat dari indeks pada gender .

  2. Saat nilai cenderung dikelompokkan dalam urutan tabel:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Padahal hanya ada 3 tahun yang berbeda di sini, catatan dengan tahun sebelumnya kemungkinan besar ditambahkan terlebih dahulu sehingga sangat banyak catatan yang harus dipindai sebelum mengembalikan 2010 pertama rekam jika bukan karena indeks.

  3. Saat Anda membutuhkan ORDER BY / LIMIT :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Tanpa indeks, filesort akan diperlukan. Meskipun agak dioptimalkan lakukan pada LIMIT , itu masih membutuhkan pemindaian tabel lengkap.

  4. Ketika indeks mencakup semua bidang yang digunakan dalam kueri:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Saat Anda membutuhkan DISTINCT :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL akan menggunakan INDEX FOR GROUP-BY , dan jika Anda memiliki sedikit warna, kueri ini akan instan bahkan dengan jutaan catatan.

    Ini adalah contoh skenario ketika indeks pada bidang kardinalitas rendah lebih efisien daripada di bidang kardinalitas tinggi.

Perhatikan bahwa jika DML kinerja tidak terlalu menjadi masalah, maka aman untuk membuat indeks.

Jika pengoptimal menganggap indeks tidak efisien, indeks tidak akan digunakan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan waktu SQL dalam satu tabel

  2. Sistem Manajemen Basis Data Relasional (RDBMS):MSSQL vs MySQL

  3. Menggunakan Pernyataan yang Disiapkan dalam C# dengan Mysql

  4. Bagaimana cara membatasi jumlah baris per nilai bidang dalam SQL?

  5. Skrip PHP untuk mengimpor data csv ke mysql