sql >> Database teknologi >  >> RDS >> Mysql

Er der en formel til at estimere indeksstørrelse i InnoDB?

I InnoDB er PRIMARY KEY er indlejret med dataene, så du kan tænke på, at det ikke tager plads.

For en sekundær nøgle... Tag MyISAM-formlen, men inkluder kolonnerne i begge den sekundære nøgle og PRIMARY KEY . Derefter ganges med 3. (Der er meget overhead.) Alligevel kan svaret være slået fra med en faktor 2 i begge retninger.

Bemærk, at hvis du har mange sekundære nøgler, gør størrelsen på PK en stor forskel i den samlede plads til tabellen+indekser.

Eksempel

SET @db ='verden', @tbl ='byer'; VÆLG n_rows AS 'Approx Rows', 'Data &PK' AS 'Type', clustered_index_size * 16384 AS Bytes, ROUND(clustered_index_size * 16384 / n_rows) AS 'Bytes/row', clustered_index_size ROUND /clustered_rows_size AS(clustered_rows_size AS) 'Rows/page' FROM mysql.innodb_table_stats WHERE database_name =@db AND table_name =@tbl UNION SELECT n_rows, 'Sekundære indekser' AS 'BTrees', sum_of_other_index_sizes * 16384 AS Bytes, ROUNDer_1s_of_6s/8 række', sum_of_other_index_sizes AS Pages, ROUND(n_rows / sum_of_other_index_sizes) AS 'Rows/page' FROM mysql.innodb_table_stats HVOR database_name =@db OG tabel_navn =@tbl OG sum_of_other>_indeks_er; kode> 

Output:

+-------------+------------------------+-------- --+-----------+-------+-----------+| Ca. rækker | Skriv | Bytes | Bytes/række | Sider | Rækker/side |+-------------+------------------------+----------- +-----------+-------+-----------+| 2637973 | Data &PK | 179077120 | 68 | 10930 | 241 || 2637973 | Sekundære indekser | 232341504 | 88 | 14181 | 186 |+-------------+--------------------+-----------+- -----------+-------+-----------+

Tabellen har to indekser:

PRIMÆR NØGLE(...) -- 14 bytesINDEX(stat, befolkning)INDEX(stat, by) stat CHAR(2) CHARACTER SET ascii -- 2 bytes befolkning INT USIGNED -- 4 bytes by -- AVG(LENGTH(by)) =1+9,07 bytesANTAL(*):2.699.354 (InnoDB-estimatet var ikke for langt fra dette)Første indeks:20 bytes * 2.7M rækker =54MBSecond indeks:26.07 bytes * 2.7M rækker i alt:2.7M. 124MBFaktisk:232MBRatio:1,9x (bemærk:jeg sprang "/0,67 over") 

Bare for at bevise et andet punkt, prøvede jeg OPTIMER TABEL . Statistikken efter der var stort set den samme:

+-------------+------------------------+-------- --+-----------+-------+-----------+| Ca. rækker | Skriv | Bytes | Bytes/række | Sider | Rækker/side |+-------------+------------------------+----------- +-----------+-------+-----------+| 2685828 | Data &PK | 179077120 | 67 | 10930 | 246 || 2685828 | Sekundære indekser | 232341504 | 87 | 14181 | 189 |+-------------+--------------------+-----------+- -----------+-------+-----------+

  1. Golang, mysql:Fejl 1040:For mange forbindelser

  2. SQL-syntaksfejl

  3. Hvorfor forårsager min SQL-streng en fejlmeddelelse:Parse-fejl:syntaksfejl i PHP?

  4. Excel download sidder fast 188kb