Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu berkaitan tentang struktur indeks. Jadi, apakah struktur indeks? Mengapa pengindeksan boleh begitu pantas? Mari kita lihat di bawah, saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: tutorial mysql
Pertama sekali, kita perlu tahu bahawa untuk mencapai kegigihan, indeks hanya boleh disimpan pada cakera keras Apabila membuat pertanyaan melalui indeks, operasi I/O pada cakera keras akan berlaku, apabila mereka bentuk indeks, adalah perlu untuk mengurangkan bilangan mencari sebanyak mungkin, dengan itu mengurangkan I/O memakan masa.
Selain itu, anda perlu mengetahui prinsip yang sangat penting: unit asas ruang penyimpanan pengurusan pangkalan data ialah 页(Page)
, dan rekod baris berbilang (Baris) disimpan dalam satu halaman.
Sistem komputer akan melakukan 预读
pengoptimuman untuk I/O cakera Apabila I/O dilakukan, sebagai tambahan kepada data pada alamat cakera semasa, data bersebelahan juga akan dibaca ke dalam penimbal memori. pool. , data yang dibaca oleh setiap I/O menjadi satu halaman dan saiz halaman lalai InnoDB ialah 16KB.
64 halaman berturut-turut membentuk 区(Extent)
, satu atau lebih takat membentuk 段(Segment)
dan satu atau lebih segmen membentuk 表空间(Tablespace)
. InnoDB mempunyai dua jenis ruang jadual Ruang jadual yang dikongsi bermakna berbilang jadual berkongsi satu ruang jadual bebas bermakna data dan indeks setiap jadual disimpan dalam ruang jadual bebas.
Struktur halaman data adalah seperti berikut (Sumber: Geek Time "MySQL Must Know"):
7 kandungan struktur halaman data boleh dibahagikan secara kasar kepada berikut tiga kategori:
Untuk butiran, sila rujuk laporan bulanan kernel pangkalan data Taobao
Sememangnya, kami akan memikirkan beberapa struktur data biasa yang terlibat dalam algoritma carian, seperti pepohon carian binari, pepohon seimbang perduaan, dsb. Malah, indeks Innodb menggunakan B 树
Dilaksanakan, mari kita lihat mengapa struktur indeks ini dipilih.
Mari kita semak secara ringkas definisi Pokok Carian Binari Dalam pepohon carian binari, jika kunci yang ditemui lebih besar daripada nod akar, maka dalam Carian dalam subpokok kanan Jika kunci lebih kecil daripada nod akar, cari dalam subpokok kiri sehingga kunci ditemui Kerumitan masa ialah O(logn). Sebagai contoh, jujukan [4,2,6,1,3,5,7] akan menjana pepohon carian binari berikut:
Walau bagaimanapun, dalam beberapa kes khas, kedalaman pepohon binari akan menjadi sangat besar. Contohnya, [1,2,3,4,5,6,7] akan menjana pokok berikut:
Dalam kes berikut, dalam kes yang paling teruk, ia memerlukan 7 kali untuk menyemak Hasil yang diingini boleh didapati, dan masa pertanyaan menjadi O(n).
Untuk mengoptimumkan keadaan ini, terdapat pepohon carian binari seimbang (pokok AVL merujuk kepada pokok yang perbezaan ketinggian antara subpokok kiri dan kanan tidak melebihi 1. Carian). kerumitan masa ialah O(logn) , ini sudah pun menjadi pepohon carian yang ideal, tetapi dalam pangkalan data dengan berpuluh-puluh juta baris rekod, kedalaman pokok itu akan tetap sangat tinggi, dan ia masih bukan struktur yang paling ideal.
Jadi, jika anda berkembang daripada pokok binari kepada pokok N-ary, mudah untuk membayangkan bahawa pokok N-ary boleh mengurangkan kedalaman pokok itu dengan banyak. Malah, struktur pokok 4 lapisan adalah Ia sudah boleh menyokong berpuluh-puluh terabait data.
B-tree (Pokok Imbangan) ialah pokok N-ary yang juga dipanggil B-pokok, yang memenuhi definisi berikut:
Biarkan k sebagai darjah B-pokok. mewakili setiap Bilangan maksimum nod anak yang boleh dimiliki oleh nod),
k - 1
kata kunci dan k
penunjuk ke nod anak Seperti yang dinyatakan di atas, setiap I/O akan pra-membaca data blok cakera, yang bersaiz satu halaman Kandungan blok cakera digunakan untuk mewakili I/O. Struktur B-tree adalah seperti Gambar berikut (Sumber: Geek Time SQL mesti tahu):
B-tree juga dipesan Memandangkan penunjuk nod anak mestilah 1 lebih daripada kata kunci , ia boleh dibahagikan kepada sub-pokok menggunakan kata kunci Bahagian nod, seperti dalam contoh dalam rajah, setiap nod mempunyai 2 kekunci dan 3 nod anak, seperti blok cakera 2, kunci titik bait pertama ialah. 3, 5 adalah kurang daripada nod anak pertamanya sendiri 8 , nod anak kedua 9, 10 adalah antara 8 dan 12, nilai nod anak ketiga 13, 15 lebih besar daripada nod anak kedua 12 sendiri.
Andaikan kita ingin mencari 9 sekarang, langkah-langkahnya adalah seperti berikut:
Anda dapat melihat bahawa walaupun banyak operasi perbandingan dilakukan, disebabkan prabacaan, perbandingan dalam blok cakera dilakukan dalam ingatan dan tidak menggunakan cakera I/O, operasi di atas hanya memerlukan 3 kali I/O untuk diselesaikan, yang merupakan struktur yang ideal.
B-tree dipertingkatkan lagi berdasarkan B-tree Perbezaan antara B-tree dan B-tree adalah seperti berikut:
Contohnya adalah seperti berikut, kata kunci nod induk ialah nilai minimum di antara nod anak (Sumber: Geek Time SQL mesti tahu):
Andaian Untuk mencari kata kunci 16, langkah carian adalah seperti berikut:
Kelebihan B-tree:
Struktur indeks lalai enjin storan memori MySQL ialah indeks Hash. Hash ialah fungsi yang dipanggil fungsi cincang, yang dihantar melalui Algoritma tertentu (seperti MD5, SHA1, SHA2, dll.) menukar input panjang sewenang-wenangnya kepada output dengan panjang tetap satu. Artikel ini tidak akan memberikan pengenalan yang mendalam kepada fungsi cincang Untuk butiran, sila rujuk kepada Baidu Encyclopedia.
Kecekapan carian hash ialah O(1), yang sangat cekap dict python, peta golang dan peta cincang java semuanya dilaksanakan berdasarkan pangkalan data Key-Value seperti Redis juga dilaksanakan Hash.
Untuk carian yang tepat, indeks Hash lebih cekap daripada indeks B-tree, tetapi indeks Hash mempunyai beberapa had dan oleh itu bukan struktur indeks paling arus perdana.
Berdasarkan sebab di atas, enjin Mysql InnoDB tidak menyokong indeks Hash, tetapi terdapat fungsi indeks Hash adaptif dalam struktur memori Apabila nilai indeks digunakan dengan sangat kerap, ia akan menjadi dalam B Berdasarkan indeks pepohon, secara automatik mencipta indeks Hash untuk meningkatkan prestasi pertanyaan.
Indeks Adaptive Hash boleh difahami sebagai "indeks indeks". Indeks Hash digunakan untuk menyimpan alamat halaman dalam indeks B-tree dan mencari nod daun yang sepadan dengan cepat. Ia boleh dilihat melalui pembolehubah innodb_adaptive_hash_index
.
Pembelajaran yang disyorkan: tutorial mysql
Atas ialah kandungan terperinci Pemahaman mendalam tentang struktur indeks MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!