我有一个由15列组成的BOOK
表,但其中大多数都是小整数(INT(1)
用于不同的等级,以及INT(4)
或INT(5)
的某个地方)< / p>
该表旨在用于通过网站上的过滤器进行动态搜索。为了加快速度,我几乎在每个INT
列上创建了索引(总共10-11个索引)。我还没有大多数数据存储在表中,但是如果出现巨大的表,我会遇到内存问题吗?
一般来说,我的问题-小整数索引是否比我期望的相对需要更多的内存?
答案 0 :(得分:1)
在表中有成千上万的行之前,缩小数据类型要容易得多。
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
,请研究我的Cookbook,以了解如何优化索引。之后,返回SHOW CREATE TABLE
和SELECTs
;我可能建议进一步调整。
即使我没有足够的RAM来缓存所有表,我也会毫不犹豫地构建一个拥有十亿行的表。