zoukankan      html  css  js  c++  java
  • MySQL索引的索引长度问题

      转自:http://samyubw.blog.51cto.com/978243/223773

      MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。
      在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:
    create table test(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=myisam;
    create index test_name on test(name1,name2,name3);
      此时报错:Specified key was too long;max key length is 1000 bytes.

      修改表结构:alter table test convert to charset utf8;
      create index test_name3 on test(name3).
      此时warning:Specified key was too long;max key length is 1000 bytes.但是索引创建成功,查看表结构可以看到创建的索引是一个前缀索引:‘key test_name3(name3(333))’

      得出的结论是:对于myisam表,如果创建组合索引,所创建的索引长度和不能超过1000 bytes,否则会报错,创建失败;对于myisam的单列索引,最大长度也不能超过1000,否则会报警,但是创建成功,最终创建的是前缀索引(取前333个字节)。

      在Innodb表中,创建组合索引:
      create table test1(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=innodb;
      create index test1_name on test(name1,name2,name3);
      此时给出warning:Specified key was too long;max key length is 767 bytes.

      修改表结构:alter table test1 convert to charset utf8;
      create index test1_name3 on test(name3).
      此时给出warning:Specified key was too long;max key length is 767 bytes.

      得出的结论是:对于创建innodb的组合索引,如果各个列中的长度不超过767,则不再计算所有列的总长度,如果有超过767的,则给出报警,索引最后创建成功,但是对于超过767字节的列取前缀索引;对于innodb的单列索引,超过767的,给出warning,最终索引创建成功,取前缀索引(取前255字节)。

  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/Michaelwjw/p/6373892.html
Copyright © 2011-2022 走看看