【问题标题】:MyISAM char(7) field has index with long key length [duplicate]MyISAM char(7) 字段具有长键长度的索引[重复]
【发布时间】:2013-10-14 09:00:18
【问题描述】:

我有一个日期维度表,其中包含一个名为 year_month_number 的 char(7) 字段,其索引如下:

ALTER TABLE `dim_date` add INDEX `year_month_number` (`year_month_number` ASC);

其中包含“2013-06”或“2013-07”等数据。

我遇到了性能问题,所以解释一下,

'1', 'SIMPLE', 'effective_date', 'ref', 'PRIMARY,year_month_number', 'year_month_number', '22', 'const', '29', 'Using where'

看起来像key_len = 22,谁能解释为什么它不是7(如this post 中所建议的那样)?我已经尝试删除并重新创建索引,

【问题讨论】:

  • 是VARCHAR(7) 还是CHAR(7)?

标签: sql indexing myisam


【解决方案1】:

不知道为什么它显示 22,可能是一些编码问题 - 是 char(7) 二进制吗?

无论如何 - 将字段更改为通常的 int,您将在其中将 YYYYMM 存储为数字,这将只有 4 个字节

【讨论】:

  • 不,它是标准的 char(7),不是二进制,也不是 varchar。我已将其更改为中等 int。这似乎可以完成这项工作,尽管密钥大小现在是 4 而不是这里建议的 3:link.
  • 索引只使用 word/dword 对齐的结构,因为它们更快,所以通常它们只能取偶数长度(如 4 个字节,8 个字节),3 是奇数
  • 找到答案!为什么key_len = 22 而不是7。每个char 占用3 个字节。 varchar 数据类型需要 2 个字节来存储字符串的长度。 reference
  • @user2847123 7*3+2 = 23,也是char,不是varchar
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多