最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

mysql索引长度tipsinnodb和myisam引擎_MySQL

来源:动视网 责编:小采 时间:2020-11-09 18:36:50
文档

mysql索引长度tipsinnodb和myisam引擎_MySQL

mysql索引长度tipsinnodb和myisam引擎_MySQL:bitsCN.com mysql索引长度tips innodb和myisam引擎 由于开发人员对索引认识不深或忽略,还有版本不同等问题,在生产环境中创建表失败,引发了一些问题。归纳了一下 测试环境 mysql> select version();+------------+| version(
推荐度:
导读mysql索引长度tipsinnodb和myisam引擎_MySQL:bitsCN.com mysql索引长度tips innodb和myisam引擎 由于开发人员对索引认识不深或忽略,还有版本不同等问题,在生产环境中创建表失败,引发了一些问题。归纳了一下 测试环境 mysql> select version();+------------+| version(
 bitsCN.com

mysql索引长度tips innodb和myisam引擎

由于开发人员对索引认识不深或忽略,还有版本不同等问题,在生产环境中创建表失败,引发了一些问题。归纳了一下

测试环境

mysql> select version();

+------------+

| version() |

+------------+

| 5.5.31-log |

+------------+

1 row in set (0.01 sec)

innodb 引擎

mysql> CREATE TABLE `meta_topic_scan` ( `domain` varchar(257) NOT NULL, `topic_name` varchar(200) NOT NULL, `topic_url` varchar(200) NOT NULL, `topic_pv` int(11) DEFAULT'0', `topic_uv` int(11) DEFAULT '0', PRIMARY KEY (`domain`,`topic_url`) ) ENGINE=innodb DEFAULT CHARSET=utf8;

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

innodb 单列索引长度不能超过767 bytes,联合索引限制是3072 bytes 。对于创建innodb的组合索引中,如果各个列中的长度有单个超过767 bytes,也会创建失败;

myisam 引擎

创建复合索引:

mysql> CREATE TABLE `meta_topic_scan` (

-> `domain` varchar(200) NOT NULL,

-> `topic_name` varchar(200) NOT NULL,

-> `topic_url` varchar(200) NOT NULL,

-> `topic_pv` int(11) DEFAULT '0',

-> `topic_uv` int(11) DEFAULT '0',

-> PRIMARY KEY (`domain`,`topic_name`,`topic_url`)

-> ) ENGINE=myisam DEFAULT CHARSET=utf8 ;

ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

创建单列索引:

mysql> CREATE TABLE `meta_topic_scan` (

-> `domain` varchar(334) NOT NULL,

-> `topic_name` varchar(200) NOT NULL,

-> `topic_url` varchar(200) NOT NULL,

-> `topic_pv` int(11) DEFAULT '0',

-> `topic_uv` int(11) DEFAULT '0',

-> PRIMARY KEY (`domain`)

-> ) ENGINE=myisam DEFAULT CHARSET=utf8 ;

ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

由此可知:myisam 单列索引长度、所创建的复合索引长度和都不能超过1000 bytes,否则会报错,创建失败。

另外不同字符集占用不同字节:latin一个字符占1 bytes,utf8存储一个字符占3 bytes, gbk存储一个字符2 bytes

扩展: innodb复合索引长度为什么是3072

我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。

所以一个记录最多不能超过8k。

又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。

由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。

单列索引限制

上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.5以后,开始支持4个字节的uutf8。255×4>767, 于是增加了一个参数叫做 innodb_large_prefix。

这个参数默认值是OFF。当改为ON时,允许列索引最大达到3072。

如下效果(5.5):



bitsCN.com

文档

mysql索引长度tipsinnodb和myisam引擎_MySQL

mysql索引长度tipsinnodb和myisam引擎_MySQL:bitsCN.com mysql索引长度tips innodb和myisam引擎 由于开发人员对索引认识不深或忽略,还有版本不同等问题,在生产环境中创建表失败,引发了一些问题。归纳了一下 测试环境 mysql> select version();+------------+| version(
推荐度:
标签: 开发 引擎 mysql
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top