mysql:很多索引,但是在小字段上

dbf7pr2w  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(250)

我有一个 BOOK 表由15列组成,但大多数是小整数( INT(1) 为了不同的收视率,也为了某个地方 INT(4) 或者 INT(5) )
该表用于网站上带有过滤器的动态搜索。为了加快速度,我在几乎所有 INT 列(共10-11个索引)。我还没有表中的大部分数据,但是如果有一个巨大的表,我的内存会有问题吗?
一般来说,我的问题是,小整数索引需要的内存比我预期的要多吗?

a2mppw5e

a2mppw5e1#

在表中有无数行之前收缩数据类型要容易得多。 INT UNSIGNED 需要4个字节,允许从0到大约40亿的数字。 TINYINT UNSIGNED 取1字节,允许值0..255。所以,如果你有一个十亿行的表 INTTINYINT 会将磁盘占用空间缩小3gb,如果它也在索引中,还会再缩小3gb(这是一种简化;希望你能理解。) SMALLINT UNSIGNED 需要2个字节,允许0..65535。这可能是你想要的而不是 INT(4) 也许吧 INT(5) ?
这个 (5) 没有任何意义(除非与 ZEROFILL ).
您的表可能是1/3数据和2/3索引。这个比率是不正常的,但不是“坏的”。
我建议您不要使用10-11个单列索引,而是使用那么多的2列索引。这将改进更多的查询。
你需要对流量有一个感觉——人们通常在哪些栏目上过滤?它们是如何过滤的?就是这样 a=7a>7 .
一旦你有可能 SELECTs ,学习我的食谱,看看如何优化索引。在那之后,带着我回来 SHOW CREATE TABLE 以及 SELECTs ; 我可能会建议进一步调整。
我会毫不犹豫地构建一个像你这样有10亿行的表,即使我没有足够的内存来缓存它。

相关问题