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

Mengoptimalkan kueri berdasarkan indeks berkerumun dan tidak berkerumun di SQL?

Saya tidak tahu tentang internal Microsoft SQL Server, tetapi saya dapat menjawab untuk MySQL, yang Anda tandai untuk pertanyaan Anda. Detailnya dapat bervariasi untuk implementasi lain.

Q1. Benar, tidak diperlukan ruang ekstra untuk indeks berkerumun.

Apa yang terjadi jika Anda menjatuhkan indeks berkerumun? Mesin InnoDB MySQL selalu menggunakan kunci utama (atau kunci unik non-null pertama) sebagai indeks berkerumun. Jika Anda mendefinisikan tabel tanpa kunci utama, atau Anda melepaskan kunci utama dari tabel yang ada, InnoDB menghasilkan kunci buatan internal untuk indeks berkerumun . Kunci internal ini tidak memiliki kolom logika untuk merujuknya.

Q2. Urutan baris yang dikembalikan oleh kueri yang menggunakan indeks non-cluster tidak dijamin. Dalam praktiknya, ini adalah urutan di mana baris diakses. Jika Anda perlu mengembalikan baris dalam urutan tertentu, Anda harus menggunakan ORDER BY dalam kueri Anda. Jika pengoptimal dapat menyimpulkan bahwa urutan yang Anda inginkan sama dengan urutan akses baris (urutan indeks, baik dengan indeks berkerumun atau tidak), maka pengoptimal dapat melewati langkah pengurutan.

Q3. Indeks non-clustered InnoDB tidak memiliki penunjuk ke baris yang sesuai di daun indeks, ia memiliki nilai dari kunci utama. Jadi pencarian di indeks non-clustered benar-benar dua pencarian B-tree, yang pertama menemukan daun indeks non-clustered, dan kemudian pencarian kedua di indeks clustered.

Ini dua kali lipat biaya pencarian B-tree tunggal (kurang lebih), jadi InnoDB memiliki fitur tambahan yang disebut Indeks Hash Adaptif . Nilai yang sering dicari akan di-cache di AHI, dan saat berikutnya kueri mencari nilai yang di-cache, ia dapat melakukan pencarian O(1). Dalam cache AHI, ia menemukan pointer langsung ke daun indeks berkerumun, sehingga menghilangkan keduanya Pencarian B-tree, sebagian dari waktu.

Seberapa besar hal ini meningkatkan kinerja total bergantung pada seberapa sering Anda menelusuri nilai yang sama yang telah ditelusuri sebelumnya. Menurut pengalaman saya, rasio penelusuran hash vs. penelusuran non-hash biasanya sekitar 1:2.

Q4. Bangun indeks untuk melayani kueri yang Anda butuhkan untuk dioptimalkan. Biasanya indeks berkerumun adalah kunci utama atau unik, dan setidaknya dalam kasus InnoDB, ini diperlukan. Baik age atau salary cenderung unik.

Anda mungkin menyukai presentasi saya, Cara Merancang Indeks, Sungguh .

Q5. InnoDB secara otomatis membuat indeks saat Anda mendeklarasikan batasan unik. Anda tidak dapat memiliki batasan tanpa indeks yang ada untuknya. Jika Anda tidak memiliki indeks, bagaimana mesin memastikan keunikan saat Anda memasukkan nilai? Itu perlu mencari seluruh tabel untuk nilai duplikat di kolom itu. Indeks membantu membuat pemeriksaan unik menjadi jauh lebih efisien.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi MySQL DEGREES() – Mengkonversi Dari Radian ke Derajat

  2. Pemicu tidak mengenali tabel (Pemicu untuk memecah konten NEW.values ​​menjadi beberapa baris untuk dimasukkan ke tabel lain)

  3. Bergabunglah dengan dua tabel, lalu Pesan Berdasarkan tanggal, TAPI gabungkan kedua tabel

  4. Bagaimana cara memilih jumlah baris terbatas untuk setiap kunci asing?

  5. PHP Periksa Baris Terakhir MySQL