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 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

MySQL可更新视图

可更新视图是指通过视图,来更新、插入、删除基本表中的数据。视图是一个虚拟表,即对视图的更新,实质上是更新基表。但是视图的构造很多时候是由多个表连接查询,以及结合...

11140
来自专栏IT开发技术与工作效率

MySQL 8 列出相关依赖 使用CTE(公共数据表达式)

直接 SQL 实现递归的 with 语法——公共数据表达式 Common Table Expressions (CTE) 是一个命名的临时结果集,它存在于单个语...

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

mysql常用命令

这几天学习了一下mysql,对于mysql的命令总结如下,发现很多方面和oracle还是差别挺大的。 # mysql -uroot -p Enter passw...

41060
来自专栏数据库新发现

如何获得跟踪文件名称

http://www.eygle.com/faq/How.To.Get.Tracefile.Name.htm

13220
来自专栏用户画像

新闻发布 sql server代码

8540
来自专栏面朝大海春暖花开

mysql树形结构递归查询

之前一直用的是Oracle,对于树形查询可以使用start with ... connect by 

1.1K40
来自专栏数据库新发现

Oracle9i新特性-使用DBMS_METADATA包获得对象DDL语句

从Oracle9i开始Oracle提供了一个新的系统包DBMS_METADATA,可以用于提取对象创建的DDL语句。

15220
来自专栏xiaoheike

为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好

网络上有大量的资料提及将 IN 改成 JOIN 或者 exist,然后修改完成之后确实变快了,可是为什么会变快呢?IN、EXIST、JOIN 在 MySQL 中...

65540
来自专栏C/C++基础

MySQL对CREATE TABLE IF NOT EXISTS SELECT的处理

MySQL支持创建持数据表时判断是否存在,存在则不创建,不存在则创建,相应语句如下:

15530
来自专栏数据分析

SQL Server 性能优化之——重复索引

1. 概述 很多人都知道索引在数据库上的是有利有弊的。像其他主流商业数据库一样SQL Server允许在一个列上重复创建索引。因为SQL Server没有限制创...

36190

扫码关注云+社区

领取腾讯云代金券