低基数列索引VS表开销

时间:2013-08-14 18:29:51

标签: mysql performance query-optimization cardinality

我有一张可容纳7万行的桌子,计划在几个月内慢慢增长到大约14万行。

我有4个低基数列,包含0/1值,如FALSE / TRUE。我有28 MB的表开销(在优化之后),表大小为6 MB。我已经为这4列添加了4个单独的简单索引。我的开销降到了20 MB。

我理解索引低基数列(其中有很多行,但很少有不同的值)对查询的性能几乎没有影响,但我的开销却下降了。没有这些索引,开销就会增加。我应该保持较低的开销还是应该保留可能无意义的索引?哪种影响最大?

P.S。表主要是从可变负载读取,范围从每分钟数千个查询到每天数百个查询。写入主要是对这4个布尔列或一个时间戳列的更新。

1 个答案:

答案 0 :(得分:1)

当您接近具有数千万行的表大小时,索引并非毫无意义 - 在处理您正在处理的表大小时,您只会看到查询性能的微小改进。

你最好不要按原样离开索引,并重新考虑你的数据库架构。一个查询不应该使用20多MB的内存,并且随着数据库的增长,它的性能只会变成更大的问题。

也就是说,在典型的mysql数据库中,从70k行跳到150k行是一个巨大的飞跃。如果性能已经成为一个问题,那么这里已经存在一个更大的问题。例如,如果要在数据库中存储大blob,最好将数据存储在文件中,并将其位置保存为表中的varchar字段。

要考虑的另一件事是,如果您必须完全保持数据库架构的方式,那就是考虑分区您的数据。您通常可以按ID或日期时间对表进行分区,并且可以看到性能的显着提升。