Varchar 索引 - 散列值会使速度更快吗?

Pet*_*lly 5 mysql index varchar index-tuning

VARCHAR(1000)我的表中有一个列。它将包含不保证唯一的字符串。我有一个查询将此列作为子句的一部分进行搜索WHERE IN,列表中的值列表IN ('...')将约为 100。在最初几个月后,该表可能会包含数百万行。我知道建立索引可能会减慢插入速度并可能创建相当大的索引。

问题

  1. 存储值的哈希值并对其进行索引和搜索是否会更快?
  2. 如果不能保证这些值是唯一的,这还有意义吗?
  3. 如果散列值使它们具有一致的长度,那么索引会使查询更快吗?

我正在运行 mysql 5.1 并使用 INNODB 引擎。

Rol*_*DBA 2

你问的有点令人畏惧。原因如下:

存储值的哈希值并对其进行索引和搜索是否会更快?

创建哈希列和索引听起来是个好主意。我已经建议回到March 03, 2013Possible INDEX on a VARCHAR field in MySql(参见建议#3)

如果不能保证这些值是唯一的,这还有意义吗?

这取决于该哈希列的基数。既然你说你将有数百万行,让我用数字来表达:

SELECT COUNT(DISTINCT hashcolumn) ...靠着桌子跑。对于一百万行的表,此计数应大于 20。换句话说,每个不同值的行数不应超过 50,000 行(表行的 5%)。任何超过 50,000 行的值都将导致 MySQL 查询优化器取消使用索引,并使全表扫描成为该哈希值的首选方法。

如果散列值使它们具有一致的长度,那么索引会使查询更快吗?

我会同时说“是”和“也许”。为什么有两个答案?相对于 MyISAM 表,建立索引并使用散列列代替长列听起来很棒。你说你正在使用InnoDB。

当谈到使用固定文本与可变文本时,我会选择 MyISAM 而不是 InnoDB

结语

如果该表在事务中使用相当频繁,则该表必须保留为 InnoDB。您可以在 MyISAM 中更好地利用您的想法。您可以继续使用哈希想法。请确保主键是单个整数列(BIGINT如果您知道您将超过 20 亿行。否则,INT)。我会进行主要的 RAM 升级并相应地增加 InnoDB 缓冲池的大小。