zoukankan      html  css  js  c++  java
  • mysql索引长度

    http://blog.csdn.net/qsc0624/article/details/51335632

    大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能超过3072。

    1. mysql> CREATE TABLE `tb` (  
    2.     ->   `a` varchar(255) DEFAULT NULL,  
    3.     ->   `b` varchar(255) DEFAULT NULL,  
    4.     ->   `c` varchar(255) DEFAULT NULL,  
    5.     ->   `d` varchar(255) DEFAULT NULL,  
    6.     ->   `e` varchar(255) DEFAULT NULL,  
    7.     ->   KEY `a` (`a`,`b`,`c`,`d`,`e`)  
    8.     -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
    9. ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes 

    可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825>3072,报错。

    为什么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。

    可以看到默认行为是建表成功,报一个warning,并且将长度阶段为255。

    注意要生效需要加row_format=compressed或者dynamic  。

     

    如果确实需要在单个很大的列上创建索引,或者需要在多个很大的列上创建联合索引,而又超过了索引的长度限制,解决办法是在建索引时限制索引prefix的大小:

    例如:create index yarn_app_result_i4 on yarn_app_result (flow_exec_id(100), another_column(50));

    这样,在创建索引时就会限制使用的每个列的最大长度。如上的例子中,在创建联合索引时,最多使用列flow_exec_id中前100个字符创建索引,最多使用another_column中前

    50个字符创建索引。这样子,就可以避免索引长度过大的问题。

     

    最后,我想说一句。我们在设计数据库时,最好不要在一个可能包含很长字符串的列上创建索引,尤其是当这个列中的字符串都很长时。如果在这类列上创建了索引,那么在创建索引时以及根据索引查询时,都会浪费很多时间在计算和存储上。有经验的设计人员应该不会这样设计数据库。

  • 相关阅读:
    tensor的维度变换
    交叉熵损失函数
    全连接层、softmax的loss
    SoftMax函数
    pytorch实现mnist识别实战
    pytorch索引与切片
    Pytorch中的torch.gather函数
    softmax函数
    Separate to Adapt Open Set Domain Adaptation via Progressive Separation论文总结
    Separate to Adapt: Open Set Domain Adaptation via Progressive Separation论文笔记
  • 原文地址:https://www.cnblogs.com/muffe/p/6667122.html
Copyright © 2011-2022 走看看