Mysql索引长度计算

(root:hostname:Fri May 29 14:10:50 2015)[liangxl]> show create table liang_2;
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------
| Table   | Create Table                                                                                                                                                
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------
| liang_2 | CREATE TABLE `liang_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  `addr` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `ind_liang_2_name` (`name`(5)),
  KEY `ind_liang_2_email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)
(root:hostname:Fri May 29 14:10:56 2015)[liangxl]> create index ind_liang_2_addr on liang_2(addr);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
(root:hostname:Fri May 29 14:11:13 2015)[liangxl]> explain select * from liang_2 where addr='asdsdadasdads';
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
| id | select_type | table   | type | possible_keys    | key              | key_len | ref   | rows | Extra       |
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | liang_2 | ref  | ind_liang_2_addr | ind_liang_2_addr | 62      | const |    4 | Using where |
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
(root:hostname:Fri May 29 14:11:32 2015)[liangxl]> explain select * from liang_2 where email='asas@ss';     
+----+-------------+---------+------+-------------------+-------------------+---------+-------+------+-------------+
| id | select_type | table   | type | possible_keys     | key               | key_len | ref   | rows | Extra       |
+----+-------------+---------+------+-------------------+-------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | liang_2 | ref  | ind_liang_2_email | ind_liang_2_email | 63      | const |    4 | Using where |
+----+-------------+---------+------+-------------------+-------------------+---------+-------+------+-------------+
1 row in set (0.01 sec)
(root:hostname:Fri May 29 14:11:51 2015)[liangxl]> explain select * from liang_2 where name='aaaab';   
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
| id | select_type | table   | type | possible_keys    | key              | key_len | ref   | rows | Extra       |
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | liang_2 | ref  | ind_liang_2_name | ind_liang_2_name | 18      | const |    1 | Using where |
+----+-------------+---------+------+------------------+------------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
(root:hostname:Fri May 29 14:12:25 2015)[liangxl]> \s;
Server characterset:    utf8
Db     characterset:      utf8
Client characterset:      utf8
Conn.  characterset:    utf8

结论:

1、int:固定占用4个字节

2、不同字符集占用字节数不同:

3、latin1:2个字节

4、utf8:3个字节

5、是否为空占用1个字节,not null不占用字节

6、变长字段需要记录长度占用2个字节

7、索引长度计算公式:varchar(20)*3+1+2=63

原文发布于微信公众号 - MYSQL轻松学(learnmysql)

原文发表时间:2015-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏撸码那些事

【眼见为实】自己动手实践理解数据库READ UNCOMMITED && SERIALIZABLE

1325
来自专栏乐沙弥的世界

使用DBMS_REDEFINITION在线切换普通表到分区表

      随着数据库数据量的不断增长,有些表需要由普通的堆表转换为分区表的模式。有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区...

822
来自专栏深度学习之tensorflow实战篇

SQL处理表结构的基本方法整理(创建表,关联表,复制表)

复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 只复制表结构到新表 CREATE TABLE 新表 SELECT * ...

3744
来自专栏林欣哲

MySQL执行计划(explain)分析

这里的索引有auditstatus和productid,可以建立联合索引。但是哪个放左边就要计算区分度。

1034
来自专栏乐沙弥的世界

使用导出导入(datapump)方式将普通表切换为分区表

      随着数据库数据量的不断增长,有些表需要由普通的堆表转换为分区表的模式。有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区...

491
来自专栏小白客

学习SQL【5】-数据更新

数据的更新处理大体可以分为插入(INSERT)、删除(DELETE)和更新(UPDATE)三类,此外,还会给大家介绍数据库中用来管理数据更新的重要概念—事务。 ...

3437
来自专栏我的博客

mysql创建临时表,将查询结果插入已有表中

        今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取。我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时...

4305
来自专栏祥子的故事

mysql |那些关于第二大的事

27810
来自专栏杨建荣的学习笔记

相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)

今天有个朋友问我一个SQL问题,大体是一个update语句,看起来逻辑没有问题,但是执行的时候却总是报错。 语句和报错信息为: UPDATE paymen...

3507
来自专栏个人随笔

MySQL基本语句

创建表 如果是关键字  那么使用反引号  `` esc下面的键 create  table  [if  not  exists] 表名(    字段1  数据类...

3537

扫码关注云+社区