低基数列索引 VS 表开销

Posted

技术标签:

【中文标题】低基数列索引 VS 表开销【英文标题】:Low cardinality column index VS table overheads 【发布时间】:2013-08-14 18:29:50 【问题描述】:

我有一个包含 7 万行的表,计划在几个月内慢慢增长到大约 14 万行。

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

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

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

【问题讨论】:

此时担心基数将是一个微优化。请参阅下面的答案。 【参考方案1】:

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

您最好将索引保持原样,然后重新考虑您的数据库架构。一个查询不应该使用 20+ MB 的内存,随着数据库的增长,它的性能只会滚雪球,变成更大的问题。

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

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

【讨论】:

我找不到合适的“MySQL InnoDB 开销”定义。我认为是除了表数据本身之外,磁盘上还存储了多少额外的数据,例如缓存和临时索引。我错了吗?那些 28 MB 的内存查询使用了吗?不久前我做了分区表,性能确实提高了(我现在有了这个,主表,表和另一个访问较少的数据,大小为 17 MB)。 你是对的!这里有一个提示:尝试在这些大查询之一之前执行“EXPLAIN EXTENDED”,以真正了解幕后发生的事情。此查询是否在执行全表扫描?您关于 SO 的下一个问题无疑是这些东西的含义,但重要的是要知道......要考虑的另一件事是数据是否首先被排序 - 即。按 X DESC 排序。首先对大数据进行排序将使用 MYSQL 中的文件排序引擎,这是另一个内存杀手。祝你好运!

以上是关于低基数列索引 VS 表开销的主要内容,如果未能解决你的问题,请参考以下文章

React - 单击表上的数据返回错误的行和列索引

使用 RedBean PHP ORM 时如何确保表被某个列索引?

确定表中输入的行和列索引

pandas使用read_csv函数读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用方括号[]基于最外层列索引名称索引列数据

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于列索引名称元组索引列数据(index tuple)

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于列索引元组列表索引多列数据(index tuple list)