【发布时间】:2021-08-17 01:38:05
【问题描述】:
我的任务是优化表的磁盘大小。假设我们有一个这样的表:
users(id, <some other fields>, role)
其中role 是最大尺寸较大的varchar,但如果我运行
select distinct `role`
from users;
我得到三个值:
管理员
常规
客人
涉及数百万条记录,很明显,由于它是varchar,每条记录分配character_size * length 个字节。
我提出了将role 更改为enum 的想法,因为它将数值映射到引擎盖下的每个可能值,并且实际文本在表级别上仅存储一次。到目前为止,一切顺利。
现在,role 字段的 index 类型为 BTREE,我在列更改后计划了这个脚本:
DROP INDEX `Role` ON users;
CREATE INDEX `Role` ON users(`role`) USING BTREE;
我的问题是:在这种情况下,另一种类型(例如 HASH)会比 BTREE 节省更多空间吗?或者,更广泛地说:就大小而言,有没有比BTREE 更好的索引类型?
【问题讨论】:
-
users表使用什么存储引擎?如果您使用 InnoDB(这是默认设置),您是否知道 InnoDB 不支持哈希索引?即使您使用“USING HASH”语法,它也会忽略您并将索引创建为 BTREE 索引。 -
@BillKarwin
innodb。答案是否定的,我没有意识到这一点。 -
与您的问题没有直接关系,但
enum有一些您应该注意的drawbacks。根据您的用例,可能首选明确的user_roles表。
标签: mysql optimization size