我有一个 BOOK 表由15列组成,但大多数是小整数( INT(1) 为了不同的收视率,也为了某个地方 INT(4) 或者 INT(5) )该表用于网站上带有过滤器的动态搜索。为了加快速度,我在几乎所有 INT 列(共10-11个索引)。我还没有表中的大部分数据,但是如果有一个巨大的表,我的内存会有问题吗?一般来说,我的问题是,小整数索引需要的内存比我预期的要多吗?
BOOK
INT(1)
INT(4)
INT(5)
INT
a2mppw5e1#
在表中有无数行之前收缩数据类型要容易得多。 INT UNSIGNED 需要4个字节,允许从0到大约40亿的数字。 TINYINT UNSIGNED 取1字节,允许值0..255。所以,如果你有一个十亿行的表 INT 至 TINYINT 会将磁盘占用空间缩小3gb,如果它也在索引中,还会再缩小3gb(这是一种简化;希望你能理解。) SMALLINT UNSIGNED 需要2个字节,允许0..65535。这可能是你想要的而不是 INT(4) 也许吧 INT(5) ?这个 (5) 没有任何意义(除非与 ZEROFILL ).您的表可能是1/3数据和2/3索引。这个比率是不正常的,但不是“坏的”。我建议您不要使用10-11个单列索引,而是使用那么多的2列索引。这将改进更多的查询。你需要对流量有一个感觉——人们通常在哪些栏目上过滤?它们是如何过滤的?就是这样 a=7 与 a>7 .一旦你有可能 SELECTs ,学习我的食谱,看看如何优化索引。在那之后,带着我回来 SHOW CREATE TABLE 以及 SELECTs ; 我可能会建议进一步调整。我会毫不犹豫地构建一个像你这样有10亿行的表,即使我没有足够的内存来缓存它。
INT UNSIGNED
TINYINT UNSIGNED
TINYINT
SMALLINT UNSIGNED
(5)
ZEROFILL
a=7
a>7
SELECTs
SHOW CREATE TABLE
1条答案
按热度按时间a2mppw5e1#
在表中有无数行之前收缩数据类型要容易得多。
INT UNSIGNED
需要4个字节,允许从0到大约40亿的数字。TINYINT UNSIGNED
取1字节,允许值0..255。所以,如果你有一个十亿行的表INT
至TINYINT
会将磁盘占用空间缩小3gb,如果它也在索引中,还会再缩小3gb(这是一种简化;希望你能理解。)SMALLINT UNSIGNED
需要2个字节,允许0..65535。这可能是你想要的而不是INT(4)
也许吧INT(5)
?这个
(5)
没有任何意义(除非与ZEROFILL
).您的表可能是1/3数据和2/3索引。这个比率是不正常的,但不是“坏的”。
我建议您不要使用10-11个单列索引,而是使用那么多的2列索引。这将改进更多的查询。
你需要对流量有一个感觉——人们通常在哪些栏目上过滤?它们是如何过滤的?就是这样
a=7
与a>7
.一旦你有可能
SELECTs
,学习我的食谱,看看如何优化索引。在那之后,带着我回来SHOW CREATE TABLE
以及SELECTs
; 我可能会建议进一步调整。我会毫不犹豫地构建一个像你这样有10亿行的表,即使我没有足够的内存来缓存它。