【问题标题】:Efficient way to index MySQL table column with utf8 charset使用 utf8 字符集索引 MySQL 表列的有效方法
【发布时间】:2010-08-08 19:12:14
【问题描述】:
CREATE TABLE profile_category (
  id mediumint UNSIGNED NOT NULL AUTO_INCREMENT,
  pc_name char(255) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是数据库中完全采用 utf8 字符集的表之一。问题就在这里(直到现在我才知道)pc_name 列的索引将增加三倍,因为 MySQL 为每个字符保留 3 个字节。在这种情况下,索引将占用更多空间。

我不能制作更短的索引,因为我需要这个值是唯一的。其中一种解决方案可以设置为pc_name char(255) CHARSET latin1 NOT NULL,,但我不知道这是否有问题。 这是一个好主意,还是有什么我不知道的解决方案?

更新:pc_name 列在应用程序中被验证为有效的 utf8。它允许非西方字符。但在这种情况下,我可以做一个交易,如果值得的话,只允许/[_A-Za-z]/

更新 2:我尝试将 pc_name 设置为 latin1 字符集,但现在出现以下异常:Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

【问题讨论】:

  • 索引通常用于加速查询而不是节省磁盘空间。
  • "所需的额外索引会显着增加表的总大小——即使列本身很小,尤其是在主键很大的情况下——并且除了外键检查之外对其他任何事情都无用。 "

标签: mysql mysql-error-1267


【解决方案1】:

如果 pc_name 将包含非西方文本,那么 latin1 将不会成为此处的选项 - 否则,请选择它。

不是 MySQL 的铁杆,我不知道混合 InnoDB 和 MySQL 表是否充满问题 - 如果没有,也许您可​​以将此表设为标准 MySQL 表并将其保留为 utf8?

【讨论】:

  • 对于 InnoDB,我有另一个表 profile.id 列作为外键。所以我想留下来。不确定数据引擎是否会改变上述问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2014-11-29
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多