Spe*_*hal 9 mysql sql postgresql
数据库中列类型的顺序是否会影响查询时间?
例如,具有混合排序(INT,TEXT,VARCHAR,INT,TEXT)的表比具有连续类型(INT,INT,VARCHAR,TEXT,TEXT)的表的查询速度慢吗?
答案是肯定的,它确实很重要,它可能很重要,但通常不多.
所有I/O都在页面级别完成(通常为2K或4K,具体取决于您的操作系统).行的列数据彼此相邻存储,除非页面变满,在这种情况下,数据写在另一页(通常是下一页)上.
列之间(基于表定义)所选列的列所需的磁盘数据空间越大,所选列的数据(有时)将在不同页面上的可能性就越大.在不同的页面上可能会导致额外的I/O操作(如果在另一页上没有选择其他行).在最坏的情况下,您选择的每个列可能位于不同的页面上.
这是一个例子:
create table bad_layout (
num1 int,
large1 varchar(4000),
num2 int,
large2 varchar(4000),
num3 int,
large3 varchar(4000)
);
create table better_layout (
num1 int,
num2 int,
num3 int,
large1 varchar(4000),
large2 varchar(4000),
large3 varchar(4000)
);
Run Code Online (Sandbox Code Playgroud)
比较:从bad_layout中选择num1,num2,num3; 从better_layout中选择num1,num2,num3;
因为对于bad_layout,每个num列基本上将位于不同的页面上,每行将需要3个i/O操作.相反,对于better_layout,num列通常位于同一页面上.
bad_layout查询可能需要大约3倍的执行时间.
良好的表格布局可以对查询性能产生很大的影响.您应该尝试将通常选中的列保持在表格布局中尽可能彼此接近.
订单不太重要.运行时间由磁盘访问时间等因素决定,磁盘访问的数量和顺序不会因重新排序行中的数据而发生变化.
唯一的例外是你的行中有一个非常大的项目(比磁盘块大得多,通常是4K?).如果表中有一个非常大的列,您可能希望将其作为最后一列,这样如果您不访问它,则可能不需要完全分页.但即便如此,您还是必须很难生成一个数据集和访问模式,其差异将是显而易见的.
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |