sql >> Databasteknik >  >> RDS >> Mysql

Frågehastighet baserat på kolumnernas ordning

Svaret är ja, det spelar roll, och det kan ha stor betydelse, men vanligtvis inte mycket.

All I/O görs på sidnivå (vanligtvis 2K eller 4K beroende på ditt operativsystem). Kolumndata för rader lagras bredvid varandra, förutom när sidan blir full, i vilket fall data skrivs på den andra (vanligtvis nästa) sida.

Ju större datautrymme på disken som krävs för kolumner mellan (baserat på tabelldefinitionen) kolumnerna du väljer, desto större är chansen att data för de valda kolumnerna (ibland) finns på olika sidor. Att vara på en annan sida kan resultera i en extra I/O-operation (om det inte finns några andra rader som väljs på den andra sidan). I värsta fall kan varje kolumn du väljer vara på en annan sida.

Här är ett exempel:

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)
);

Jämföra:välj num1, num2, num3 från dålig_layout; välj num1, num2, num3 från better_layout;

Eftersom för bad_layout varje num-kolumn i princip kommer att vara på en annan sida, kommer varje rad att kräva 3 i/O-operationer. Omvänt, för better_layout kommer antalet kolumner vanligtvis att vara på samma sida.

Bad_layout-frågan kommer sannolikt att ta cirka 3 gånger längre tid att köra.

Bra tabelllayout kan göra stor skillnad för frågeprestanda. Du bör försöka hålla kolumner som vanligtvis väljs tillsammans så nära varandra som möjligt i tabelllayouten.



  1. PHP konverterar datetime till sekunder

  2. Postgres datum överlappande begränsning

  3. Dynamiskt alternativ till pivot med CASE och GROUP BY

  4. Hur man optimerar COUNT(*) prestanda på InnoDB genom att använda index