mysql InnoDB 中的许多 NULL 列是否有害?

Goo*_*bot 6 mysql innodb mysql-5 performance null

在探索 InnoDB 的聚集 B 树索引系统时,我认为许多 NULL(或小)列的存在对 InnoDB 性能没有显着影响。

多余列的存在是否会降低 mysql 的性能?

PS我尝试了实际测试,但没有显着效果。不过我觉得应该是在重载的情况下比较的。这就是我很想了解关于这件事的技术推理的原因。

Rol*_*DBA 8

我能看到的唯一伤害是对大表进行 COUNT 查询。

这样做SELECT COUNT(*) FROM mytable的一个InnoDB表应该产生一个全表扫描。然而,想想 COUNT( ) 实际上做*了什么代表一整排。COUNT( ) 可以确定是否存在非 NULL 列。最简单的方法是确保 PRIMARY KEY 列是顺序位置的第一列。根据定义,PRIMARY KEY 列始终为 NOT NULL。因此,SELECT COUNT(*) FROM mytable将与 一样快SELECT COUNT(1) FROM mytable

我不会担心过多的列,因为 InnoDB 将数量上限设置为 1000。当然,恕我直言,表中有 20-30 列(不管存储引擎)太高了,这表明设计不佳(乞求规范化) ) 或太大的列数据。

PostgreSQL 解决了有 TOAST 表的问题。TOAST 代表外部属性存储技术。它管理对于普通行存储来说太大的列数据。

InnoDB 没有像 TOAST 这样的机制,所以我希望在.ibd文件或 ibdata1 中进行某种类型的行链接。尽管如此,NULL 列将阻止过大行数据的物理表现。任何人都可以忍受。

只要 InnoDB 表被正确索引,NULL 列就不是问题。此外,所有非唯一索引都有内部 rowid 回到聚集索引(又名 gen_clust_index)。因此,经过良好调整的查询将始终通过聚集索引访问数据。

  • 非常有用的信息。但是,我不同意表 20-30 列是由于设计不当造成的;有时我们需要它,比如存储一组统计数据。 (3认同)

小智 5

根据 Mysql 官方文档:

如果可能,将列声明为 NOT NULL。通过更好地使用索引并消除测试每个值是否为 NULL 的开销,它使 SQL 操作更快。您还可以节省一些存储空间,每列一位。如果您的表中确实需要 NULL 值,请使用它们。只需避免在每列中允许 NULL 值的默认设置。http://dev.mysql.com/doc/refman/5.5/en/data-size.html