1.所有的索引欄位,如果沒有設置not null,則需要加一個位元組。2.定長欄位,int占4個位元組、date占3個位元組、char(n)占n個字元。3.變長欄位,varchar(n),則有n個字元+兩個位元組。4.不同的字元集,一個字元占用的位元組數不同。latin1編碼的,一個字元占用1個位元組,gbk編 ...
1.所有的索引欄位,如果沒有設置not null,則需要加一個位元組。
2.定長欄位,int占4個位元組、date占3個位元組、char(n)占n個字元。
3.變長欄位,varchar(n),則有n個字元+兩個位元組。
4.不同的字元集,一個字元占用的位元組數不同。latin1編碼的,一個字元占用1個位元組,gbk編碼的,一個字元占用2個位元組,utf8編碼的,一個字元占用3個位元組。 utf8mb4是一個字元占4個位元組
5.使用explain語句查詢到的key_len欄位,可以適用於上面的計算規則,可以看到查詢是否使用到了聯合索引
6.mysql優化器會對條件中的 and的前後順序根據多列索引順序自動糾正過來
通過索引的長度查看下麵sql語句是否使用到了索引
CREATE TABLE `index_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL DEFAULT '',
`gid` int(11) NOT NULL DEFAULT '0',
`age` int(11) NOT NULL DEFAULT '0',
`score` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name_gid_age_index` (`name`,`gid`,`age`),
KEY `score_index` (`score`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
insert into index_test values(null,'taoshihan',2,1,0);
insert into index_test values(null,'taoshihan',2,2,0);
insert into index_test values(null,'taoshihan',2,3,0);
explain select * from index_test where name='taoshihan' group by gid;
+----+-------------+------------+------------+-------+--------------------+--------------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+-------+--------------------+--------------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | index_test | NULL | index | name_gid_age_index | name_gid_age_index | 310 | NULL | 6 | 66.67 | Using where |
+----+-------------+------------+------------+-------+--------------------+--------------------+---------+------+------+----------+-------------+
key_len的長度是310,也就是100*3+2 + 4 +4