MySQL:哈希索引与表连接

时间:2016-11-30 06:57:51

标签: mysql sql

我有相当大的MySQL表(超过1000万行,innoDB引擎),该表有一个字段,表示行的类别(varchar(40)),类别小于10。

现在我有两个选择:

  1. 保留字段并在其上设置hash index
  2. 将该字段设为另一个category表格,并将其与category_id
  3. 相关联

    哪一个具有更好的性能以及为什么使用这两个操作:

    1. 查询所有类别(我知道分隔的表可能更快,但它真的更快吗?甚至与hash index相比?)
    2. 查询指定类别中的所有行(我假设hash index应该更快,但不确定,因为有人告诉我MySQL opitimizer会使表加入小表更快)
    3. 编辑:我几乎从不在这里添加新类别。

2 个答案:

答案 0 :(得分:3)

您可以在类别列上定义索引,它会更快地对特定类别进行一些查询(假设您搜索的类别不会出现在大多数行中)。 varchar上的索引以这种方式运行良好。

您可以为类别名称创建查找表的原因是,如果要更改类别名称,可以通过更改类别查找表中的一行来实现,而不是在主要数据库中更改数千行表

顺便说一句,你使用短语“hash index”是错误的。 InnoDB不支持哈希索引,只支持B树索引和全文索引。

答案 1 :(得分:0)

考虑到对于任何数据库,检查数字(整数)比检查字符串更快。我相信如果您创建一个X-REF表,如果您将字符串转换为大表记录的ID,并将此字段设置为索引,则会收到最快的结果。

如上所述,您将通过协助您的数据库比较10M数字而不是10M字符串来获得性能。

另外,正如Bill Karwin建议的那样,这将允许您以最灵活的方式更改/添加类别。

最后,如果你不希望类别的总数增加到2000以上,你甚至可以使大表的索引字段只是一个两字节的整数。