回答

收藏

基于列顺序的查询速度

技术问答 技术问答 320 人阅读 | 0 人回复 | 2023-09-14

数据库中列类型的顺序是否对查询时间有影响?; U- x; R0 N2 f9 q0 S
例如,具有混合顺序(INT,TEXT,VARCHAR,INT,TEXT)的表的查询是否比具有连续类型(INT,INT,VARCHAR,TEXT,TEXT)的表的查询慢?6 a( S5 ^; P0 g$ x8 V
                : E6 V5 k! Q( ^  e9 y- L' R1 L
解决方案:
) X3 ?5 M+ A& Z# E1 e, _1 F' |+ b                ( Y" x4 H. C7 B- v
6 y/ @' d3 X/ @2 }. m% ^( A" f3 Z

! ^, _' j' c0 F                答案是肯定的,这确实很重要,并且可能很重要,但 通常 并不重要。
. j. C2 F: }/ B所有I / O都在页面级别完成(根据您的操作系统,通常为2K或4K)。行的列数据彼此相邻存储,除非页面已满,否则在另一页(通常是下一页)上写入数据。0 M2 H( @% g& f- n; ]' O# c4 V
所选列之间(基于表定义)的列所需的磁盘数据空间越大,则所选列的数据(有时)在不同页面上的机会就越大。在其他页面上可能会导致额外的I /
) ?- P+ A1 V& XO操作(如果在另一页面上没有选择其他行)。在最坏的情况下,您选择的每一列可能在不同的页面上。7 }4 b7 O  D6 P- J
这是一个例子:7 X; b2 o- g: j7 C
create table bad_layout (6 K9 R5 L/ X4 |* e5 O
num1 int,
4 g! V1 O4 H3 c) d2 D1 ]8 s; Nlarge1 varchar(4000),8 l- B, }2 n1 P$ e# G$ B% \5 `3 V2 D
num2 int,4 n* u+ v! B8 C5 v8 o
large2 varchar(4000),' d7 T% j6 Q, Q+ B/ `
num3 int,' W, l! R. ?4 H2 f; r: X  e
large3 varchar(4000)
7 v% h# @! ~4 q( R);
& n( `5 J0 s: m! N- S6 ]create table better_layout (
! C" a4 T' o4 m7 [. R( a1 ?num1 int,) {$ d- S8 B( Y" l6 o. x
num2 int,
: |) ~% a- D1 t% J. dnum3 int,
  h2 }$ N( H3 vlarge1 varchar(4000),
! E. q5 E, p4 a% O' t7 ~/ rlarge2 varchar(4000),
; z; S  e& U3 ~. B% qlarge3 varchar(4000)
& E* G6 ^* |# d* h/ Y- o  R! L);
! `. b+ U1 @) Q  b1 z比较:从bad_layout中选择num1,num2,num3;从Better_layout中选择num1,num2,num3;
- b0 {4 \3 g2 B: {因为对于bad_layout,每个num列基本上都将位于不同的页面上,所以每一行将需要3个i /1 h$ ^2 M' e( Q& X, q
o操作。相反,对于Better_layout,通常将num列放在同一页上。* |2 M" K1 u* h& F
bad_layout查询的执行时间可能大约要长3倍。1 @' K& b5 K5 Y
良好的表布局可以对查询性能产生很大的影响。您应该尝试使通常选择在一起的列在表布局中尽可能地彼此靠近。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则