国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL的查詢計(jì)劃中ken_len的值計(jì)算方法

2024-07-24 12:52:37
字體:
供稿:網(wǎng)友

key_len的含義

在MySQL中,可以通過explain查看SQL語句所走的路徑,如下所示:

mysql> create table t(a int primary key, b int not null, c int not null, index(b)); Query OK, 0 rows affected (0.01 sec) mysql> explain select b from t ; +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | t | index | NULL | b | 4 | NULL | 1 | Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 1 row in set (0.00 sec)

其中,key_len表示使用的索引長度,是以字節(jié)為單位。在上面的例子中,由于int型占用4個(gè)字節(jié),而索引中只包含了1列,所以,key_len是4。

下面是聯(lián)合索引的情況:

mysql> alter table t add index ix(b, c);Query OK, 0 rows affected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> explain select b, c from t ;+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | t | index | NULL | ix | 8 | NULL | 1 | Using index |+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+1 row in set (0.00 sec)

聯(lián)合索引ix包含了2列,并且都使用到了,所以,這里ken_len是8。

到這里,我們已經(jīng)可以理解key_len的含義了,似乎已經(jīng)沒有什么可講的了,但是,MySQL中key_len的計(jì)算還有很多需要注意的地方。

例如,我們將b這一列的NOT NULL約束去掉,然后ken_len就和我們預(yù)期不一樣了,如下所示:

mysql> alter table t modify b int;Query OK, 0 rows affected (0.01 sec)Records: 0 Duplicates: 0 Warnings: 0 mysql> explain select b from t;+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | t | index | NULL | b | 5 | NULL | 1 | Using index |+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+1 row in set (0.00 sec)

MySQL中key_len計(jì)算規(guī)則

MySQL中,key_len的計(jì)算規(guī)則如下:

如果列可以為空,則在數(shù)據(jù)類型占用字節(jié)的基礎(chǔ)上加1,如int型,不能為空key_len為4,可以為空key_len為5 如果列是變長的,則在數(shù)據(jù)列所占字節(jié)的基數(shù)上再加2,如varbinary(10),不能為空,則key_len為10 + 2 ,可以為空則key_len為10+2+1 如果是字符型,則還需要考慮字符集,如某列的定義是varchar(10),且是utf8,不能為空,則key_len為10 * 3 + 2,可以為空則key_len為10*3+2+1 此外,decimal列的計(jì)算方法與上面一樣,如果可以為空,則在數(shù)據(jù)類型占用字節(jié)的基礎(chǔ)上加1,但是,decimal本身所占用字節(jié)數(shù),計(jì)算就比較復(fù)雜。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 连南| 彰化市| 武冈市| 建湖县| 项城市| 平顺县| 盐山县| 冕宁县| 洛扎县| 岫岩| 二连浩特市| 孟津县| 开平市| 东乡县| 启东市| 瑞丽市| 遂平县| 邯郸县| 稻城县| 四子王旗| 北碚区| 石楼县| 汤原县| 确山县| 无棣县| 万安县| 靖江市| 玛沁县| 石楼县| 儋州市| 宾阳县| 包头市| 博白县| 阿图什市| 炉霍县| 忻州市| 荆州市| 扬州市| 天津市| 融水| 兰考县|