首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB的哈希索引

InnoDB的哈希索引
EN

Database Administration用户
提问于 2015-06-03 22:15:59
回答 1查看 692关注 0票数 0

我看到了一个如下所示的数据库模式

代码语言:javascript
复制
CREATE TABLE foo (
    name_hash bigint,
    name varachar(500),
    a varchar(500),
    b varchar(500),
    ...
    PRIMARY KEY (name_hash),
    KEY ...
);

这似乎是试图通过使用8字节整数而不是100字节字符串来限制索引大小。当按名称查找值时,应用程序对其进行散列处理,然后在SQL查询中而不是在名称中使用该哈希。

这相当乏味,我不确定是否有必要。

MySQL InnoDB是否有类似的特性--通过其短得多的散列查找字符串,以便将索引放入内存?

还是它已经做了这样的事?

EN

回答 1

Database Administration用户

发布于 2015-06-08 22:35:59

InnoDB没有任何工具可以做您所描述的事情。

InnoDB在索引中的每列限制为767字节。它有容纳VARCHAR(255) utf8VARCHAR(191) utf8mb4的空间。此外,如果整个记录大于8KB,InnoDB希望将long VARCHARs放在不同的块中。这会很普遍吗?(当您可以合理地声明一个较小的限制时,不要盲目地使用VARCHAR(500)。)

计划A:压缩(在客户端) name并将其存储到VARBINARY(255)中。假设它是典型的文本,压缩大约是3:1。使用它而不是哈希。

方案B:将名称拆分为2或3列,以便遵守索引限制。(一个丑陋的解决方案!)

C计划:改变767的限制。(这是可能的,但我现在忘记了细节。)

要注意的是:任何像样的“散列”都是随机的。也就是说,每一行都会在表中的某个随机位置落地。一旦表超过innodb_buffer_pool_size,您将执行越来越多的I/O操作,从而降低速度。

SELECTs会是什么样子?这张桌子上还有其他索引吗?JOIN on name_hash好吗?所有这些都可能影响到设计模式的“最佳”方式。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/103202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档