Apakah maksud key_len dalam mysql explain dan cara mengiranya

王林
Lepaskan: 2023-06-02 09:52:13
ke hadapan
2562 orang telah melayarinya

Kata Pengantar

Terdapat lajur key_len dalam hasil pelaksanaan explain dalam Mysql, jadi apakah maksud key_len?

key_len: Menunjukkan bilangan bait yang digunakan oleh indeks Berdasarkan nilai ini, penggunaan indeks boleh dinilai Terutama apabila menggabungkan indeks, adalah sangat penting untuk menilai berapa banyak bahagian indeks digunakan.

Nota pengiraan key_len:

  • Maklumat tambahan untuk medan indeks: boleh dibahagikan kepada jenis data panjang ubah dan panjang tetap untuk perbincangan . Apabila medan indeks Apabila ia adalah jenis data panjang tetap, seperti char, int, datetime, tanda diperlukan untuk menunjukkan sama ada tanda ini menduduki 1 bait (untuk medan yang bukan nol, 1 bait ini tidak diperlukan); untuk medan panjang berubah Jenis data, seperti varchar, sebagai tambahan kepada tanda kosong, juga memerlukan maklumat panjang, yang mengambil dua bait.

  • Untuk set aksara seperti char, varchar, blob, teks, dll., panjang len kekunci juga berkaitan dengan set aksara Satu aksara latin1 menduduki 1 bait, dan satu aksara gbk menduduki satu bait 2 bait, satu aksara UTF8 menduduki 3 bait.

Contoh:

列类型 KEY_LEN 备注
id int key_len = 4+1 int为4bytes,允许为NULL,加1byte
id bigint not null key_len=8 bigint为8bytes
user char(30) utf8 key_len=30*3+1 utf8每个字符为3bytes,允许为NULL,加1byte
user varchar(30) not null utf8 key_len=30*3+2 utf8每个字符为3bytes,变长数据类型,加2bytes
user varchar(30) utf8 key_len=30*3+2+1 utf8每个字符为3bytes,允许为NULL,加1byte,变长数据类型,加2bytes
detail text(10) utf8 key_len=30*3+2+1 TEXT截取部分,被视为动态列类型。

Nota: key_len hanya menunjukkan lajur indeks yang dipilih apabila digunakan untuk penapisan bersyarat di mana, dan tidak termasuk susunan oleh/ kumpulan mengikut bahagian lajur indeks yang dipilih ini.

Sebagai contoh, terdapat idx indeks bersama (c1, c2, c3), dan tiga lajur adalah int bukan nol Kemudian dalam pelan pelaksanaan SQL berikut, nilai key_len ialah 8 daripada 12:

select ... from tb where c1=? and c2=? order by c1;
Salin selepas log masuk

Contoh

Berikut ialah contoh khusus untuk menggambarkan struktur jadual:

CREATE TABLE `t4` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL DEFAULT '0',
  `b` int(11) NOT NULL DEFAULT '0',
  `c` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index1` (`a`,`b`)
) ENGINE=InnoDB;
Salin selepas log masuk

Hasil pelaksanaan explain adalah seperti berikut:

mysql> explain select * from t4 where a =0 and b > 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 8       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
mysql> explain select * from t4 where a > 0 and b = 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 4       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
Salin selepas log masuk

Anda boleh melihat a= Keputusan 0&b>0 dan a>0&b=0 explain adalah "hampir" Kedua-duanya menggunakan indeks1 dan kedua-duanya adalah hasil indeks julat (iaitu mengimbas. julat indeks). Satu-satunya perbezaan ialah key_len. Berdasarkan key_len panjang indeks, anda boleh membuat kesimpulan berapa banyak dimensi yang digunakan oleh indeks berbilang dimensi. (Indeks MySQL adalah semua indeks awalan)

indeks1 ialah indeks KEY index1 dua dimensi (a,b), jadi panjangnya hendaklah 4+4.

a=0&b>0 key_len ialah 8, yang bermaksud bahawa hasilnya hanya boleh diperolehi dengan menggunakan indeks Mula-mula gunakan a=0 untuk mencari nod pokok, dan kemudian tapis mengikut b>0 di bawahnya untuk mendapatkan hasilnya. Iaitu, anda boleh mendapatkan hasil "sepenuhnya" dengan menggunakan indeks.

a>0&b=0 key_len ialah 4, yang bermaksud bahawa hanya dimensi pertama indeks awalan digunakan, hanya a>0 digunakan untuk mendapatkan hasil (kunci utama), dan kemudian keseluruhan key_len ialah baca dalam indeks kunci primer (indeks berkelompok) OK, tapis data yang berkaitan berdasarkan b=0 dan dapatkan hasilnya. Iaitu, "tidak lengkap" menggunakan indeks untuk mendapatkan hasilnya.

Atas ialah kandungan terperinci Apakah maksud key_len dalam mysql explain dan cara mengiranya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan