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

Kardinalitas indeks MySQL - kinerja vs efisiensi penyimpanan

Kardinalitas yang lebih tinggi berarti kinerja membaca yang lebih baik karena, menurut definisi, ada lebih sedikit catatan untuk dibaca.

Untuk memproses kueri seperti ini:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, mesin harus melakukan langkah-langkah berikut:

  1. Temukan entri pertama yang memenuhi persyaratan.

    Ini dilakukan melintasi B-Tree , mulai dari entri root.

    Di seluruh halaman, pencarian dilakukan dengan mengikuti B-Tree link; dalam halaman, pencarian dilakukan menggunakan pencarian biner (kecuali kunci Anda dikompresi, dalam hal ini pencarian linier).

    Algoritma ini memiliki efisiensi yang sama untuk kolom kardinalitas tinggi dan kolom kardinalitas rendah. Menemukan 3 pertama (sebagai lawan dari 3 ) dalam daftar ini:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    membutuhkan O(log(n)) yang sama langkah.

  2. Melintasi indeks hingga nilai kunci berubah. Ini, tentu saja, membutuhkan waktu linier:semakin banyak catatan yang Anda miliki, semakin banyak yang harus Anda lewati.

Jika Anda hanya membutuhkan catatan pertama:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, kardinalitas kolom tidak memengaruhi kinerja baca.

Setiap kunci indeks memiliki nilai tambahan tersembunyi:penunjuk catatan. Inilah inti dari memiliki indeks:Anda perlu tahu catatan mana yang ditunjuknya.

Karena penunjuk catatan, menurut definisi, adalah unik, setiap kunci indeks juga unik. Entri indeks yang berbagi nilai kunci yang sama diurutkan berdasarkan penunjuk catatan.

Ini untuk membuat indeks dapat dipelihara:jika Anda menghapus catatan dengan nilai kolom terindeks yang dibagikan oleh satu juta catatan lain, catatan indeks terkait juga harus dihapus. Tetapi seluruh juta catatan indeks tidak diperiksa:sebagai gantinya, penunjuk catatan digunakan sebagai kondisi pencarian tambahan.

Setiap kunci indeks sebenarnya unik (bahkan jika Anda tidak mendefinisikan indeks sebagai unik), dan, karenanya, memiliki kardinalitas maksimum yang mungkin.

Jadi jawaban atas pertanyaan Anda adalah:tidak, kardinalitas kolom tidak mempengaruhi kinerja penulisan indeks.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa pernyataan ini rs=st.executeQuery(query); tidak mengasyikkan? Bagaimana saya bisa memilih hanya tabel yang bergantung pada input type=radio dari mysql dari dua tabel?

  2. Hibernasi bergabung dengan dua tabel dan ambil semua catatan?

  3. Cara Mencadangkan Database MySQL Chamilo LMS Anda

  4. MySQL Query Daftar Nilai

  5. Kesalahan hanya baca MySQL yang aneh