【问题标题】:how does mysql allocate the key length of a primary key or foreign key?mysql如何分配主键或外键的键长?
【发布时间】:2013-04-10 19:50:48
【问题描述】:

我创建了一个具有 2 种不同字符集类型的表:utf8 和 latin1。

1)

CREATE TABLE `aaa` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2)

CREATE TABLE `aaa` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后我将值插入几行。 当使用“解释”选择两个表时,我得到了不同的 key_len:

1)

mysql> explain select count(*) from aaa where name = "haha";

|编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 |

| 1 |简单 |啊!参考 |姓名 |姓名 | 258 |常量 | 2 |使用哪里;使用索引 |

集合中的 1 行(0.00 秒)

2)

mysql> explain select count(*) from aaa where name = "haha";

|编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 |

| 1 |简单 |啊!参考 |姓名 |姓名 |第768章常量 | 2 |使用哪里;使用索引 |

集合中的 1 行(0.01 秒)

我不知道系统如何为使用不同字符集定义的类似表分配key_len?

【问题讨论】:

    标签: mysql sql database indexing sql-tuning


    【解决方案1】:

    由于utf8是多字节字符集,MySQL需要为每个字符预留三个字节:

    utf8, a UTF-8 encoding of the Unicode character set using one to three bytes per character. 
    

    http://dev.mysql.com/doc/refman/5.6/en/charset-unicode.html

    除此之外,似乎还有三个字节的开销。

    【讨论】:

    • 谢谢,这真的很有道理。
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多