MySQL:许多索引,但范围很小

时间:2018-06-22 13:53:06

标签: mysql indexing

我有一个由15列组成的BOOK表,但其中大多数都是小整数(INT(1)用于不同的等级,以及INT(4)INT(5)的某个地方)< / p>

该表旨在用于通过网站上的过滤器进行动态搜索。为了加快速度,我几乎在每个INT列上创建了索引(总共10-11个索引)。我还没有大多数数据存储在表中,但是如果出现巨大的表,我会遇到内存问题吗?

一般来说,我的问题-小整数索引是否比我期望的相对需要更多的内存?

1 个答案:

答案 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=7a>7

一旦您可能有SELECTs,请研究我的Cookbook,以了解如何优化索引。之后,返回SHOW CREATE TABLESELECTs;我可能建议进一步调整。

即使我没有足够的RAM来缓存所有表,我也会毫不犹豫地构建一个拥有十亿行的表。