出于纯粹的美观原因,我总是将表的第一列作为主键列。此后,我不再注意将列添加到表中的顺序。这错了吗?
将表中的整数列放在文本或二进制列之前是否有性能优势?或者也许先放置索引列?
虽然我当前使用的数据库是 MySQL,但其他数据库的答案也会有所帮助。
答案1
这错了吗?
不,我也是这么做的 - 主要是因为桌子总是以 PK 开始。
将表中的整数列放在文本或二进制列之前是否有性能优势?或者也许先放置索引列?
在 SQL Server 上则不然。如果在 MySQL 上,除非开销真的很小,否则这将是一个相当大的失误。索引与表是分开的。在数据库的整个生命周期中,索引列甚至现有列都可能发生变化。
答案2
事实上,真的热的负载,它会产生重大影响。如果你看看记录剖析您将看到列跟在记录头后面,首先是固定列,然后是可变长度列。因此,每当访问列时,必须先访问记录头,并且此访问是几乎总是 L2 缓存未命中。同一缓存行(64 字节)内的任何后续访问几乎 100% 都会是 L2 缓存命中。考虑到 L2 缓存未命中和命中之间的 CPU 周期差异约为 2 个数量级,如果您将经常访问的列安排在记录头附近,您将获得相当大的性能提升。端到端性能提升不会达到 2 个数量级,但对于某些 OLTP 负载,它总体上可以增加 5-10%。对于分析负载,IO 的成本压倒了其他一切,您可能无法衡量任何差异。
这种逻辑适用于每个指数单独地,但是在索引上,您必须考虑声明索引的顺序是键的实际顺序,因此您没有太多的改变空间。
答案3
我想说在 SQL Server 上这无关紧要。SQL Server 会读取整个页面,我不确定到达页面第 3 列的处理是否比第 2 列或第 5 列或其他任何列的处理要多。
对于表来说无关紧要,但对于索引来说却很重要。索引中的第一列必须位于要使用的索引的 WHERE 子句中。