Pet*_*lly 5 mysql index varchar index-tuning
VARCHAR(1000)我的表中有一个列。它将包含不保证唯一的字符串。我有一个查询将此列作为子句的一部分进行搜索WHERE IN,列表中的值列表IN ('...')将约为 100。在最初几个月后,该表可能会包含数百万行。我知道建立索引可能会减慢插入速度并可能创建相当大的索引。
我正在运行 mysql 5.1 并使用 INNODB 引擎。
你问的有点令人畏惧。原因如下:
存储值的哈希值并对其进行索引和搜索是否会更快?
创建哈希列和索引听起来是个好主意。我已经建议回到March 03, 2013:Possible INDEX on a VARCHAR field in MySql(参见建议#3)
如果不能保证这些值是唯一的,这还有意义吗?
这取决于该哈希列的基数。既然你说你将有数百万行,让我用数字来表达:
SELECT COUNT(DISTINCT hashcolumn) ...靠着桌子跑。对于一百万行的表,此计数应大于 20。换句话说,每个不同值的行数不应超过 50,000 行(表行的 5%)。任何超过 50,000 行的值都将导致 MySQL 查询优化器取消使用索引,并使全表扫描成为该哈希值的首选方法。
如果散列值使它们具有一致的长度,那么索引会使查询更快吗?
我会同时说“是”和“也许”。为什么有两个答案?相对于 MyISAM 表,建立索引并使用散列列代替长列听起来很棒。你说你正在使用InnoDB。
当谈到使用固定文本与可变文本时,我会选择 MyISAM 而不是 InnoDB
Sep 26, 2012:针对这些项目需求,选择 MyISAM 而不是 InnoDB;和长期选择May 10, 2011:在固定大小字段上使用 CHAR 与 VARCHAR 对性能有何影响?Mar 25, 2011:MySQL VARCHAR 大小的性能影响如果该表在事务中使用相当频繁,则该表必须保留为 InnoDB。您可以在 MyISAM 中更好地利用您的想法。您可以继续使用哈希想法。请确保主键是单个整数列(BIGINT如果您知道您将超过 20 亿行。否则,INT)。我会进行主要的 RAM 升级并相应地增加 InnoDB 缓冲池的大小。
| 归档时间: |
|
| 查看次数: |
6331 次 |
| 最近记录: |