出于纯粹的理由,我总是把表格的第一列作为主键列。 之后,我没有考虑到订单列被添加到表中。 这是错的吗?
在文本或二进制列之前的表中放置整数列是否有性能优势? 或者,也许首先索引列?
虽然我正在使用的当前数据库是MySQL的其他数据库的答案将是有帮助的。
这是错的吗?
不,我也这么做 – 主要是因为桌子总是以PK开头。
在文本或二进制列之前的表中放置整数列是否有性能优势? 或者,也许首先索引列?
不在SQL Server上。 如果是在MySQL上,这将是一个非常重要的比例,除非开销很小。 指数是独立存在的。 在数据库的整个生命周期中,索引列甚至现有的列都可以改变。
事实上,对于真正的热负荷,它可以产生重大的影响。 如果你看一个logging的解剖结构,你会看到列跟着logging标题,首先固定列,然后是可变长度列。 所以无论何时访问列,都必须首先访问logging头,并且此访问几乎总是L2高速caching未命中 。 在相同的caching行(64字节)内的任何后续访问将是几乎100%的时间命中的L2caching。 假设二级caching未命中和一次命中之间的CPU周期差异约为2个数量级,如果您将频繁访问的列安排在logging标题附近,则性能会有很大的提升。 端到端的性能提升不会在任何地方达到2个数量级,但是对于某些OLTP负载,总共可以达到5-10%。 对于分析负载,IO的成本压倒一切,你可能无法衡量任何差异。
这个逻辑单独应用于每一个索引 ,但是在索引上你必须考虑索引索引的顺序是密钥的实际顺序,所以你没有太大的改变空间。
我会说在SQL Server上并不重要。 SQL Server读取整个页面,我不确定到页面第三列的处理是否比第二或第五或其他任何更多。
对于表格无关紧要,但是对于索引来说也是如此。 索引中的第一列必须位于要使用的索引的WHERE子句中。