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.
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;
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;
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 | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
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!