Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy istnieje wzór do oszacowania wielkości indeksu w InnoDB?

W InnoDB PRIMARY KEY jest osadzony z danymi, więc możesz myśleć o tym, że nie zajmuje miejsca.

W przypadku klucza dodatkowego... Weź wzór MyISAM, ale uwzględnij kolumny oba klucz pomocniczy i PRIMARY KEY . Następnie pomnóż przez 3. (Istnieje dużo narzutu). Mimo to, odpowiedź może być przesunięta o współczynnik 2 w każdym kierunku.

Zwróć uwagę, że jeśli masz dużo kluczy pomocniczych, rozmiar PK robi dużą różnicę w ogólnej przestrzeni dla tabeli+indeksów.

Przykład

SET @db = 'world', @tbl = 'cities';
    SELECT      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 AS Pages,
                ROUND(n_rows / clustered_index_size) AS 'Rows/page'
        FROM mysql.innodb_table_stats
        WHERE database_name = @db
          AND table_name = @tbl
    UNION
        SELECT  n_rows,
                'Secondary Indexes' AS 'BTrees',
                sum_of_other_index_sizes * 16384 AS Bytes,
                ROUND(sum_of_other_index_sizes * 16384 / n_rows) AS 'Bytes/row',
                sum_of_other_index_sizes AS Pages,
                ROUND(n_rows / sum_of_other_index_sizes) AS 'Rows/page'
        FROM mysql.innodb_table_stats
        WHERE database_name = @db
          AND table_name = @tbl
          AND sum_of_other_index_sizes > 0
          ;
-- (Percona has a different way.)

Wyjście:

+-------------+-------------------+-----------+-----------+-------+-----------+
| Approx Rows | Type              | Bytes     | Bytes/row | Pages | Rows/page |
+-------------+-------------------+-----------+-----------+-------+-----------+
|     2637973 | Data & PK         | 179077120 |        68 | 10930 |       241 |
|     2637973 | Secondary Indexes | 232341504 |        88 | 14181 |       186 |
+-------------+-------------------+-----------+-----------+-------+-----------+

Tabela ma dwa indeksy:

PRIMARY KEY(...)  -- 14 bytes
INDEX(state, population)
INDEX(state, city)
  state CHAR(2) CHARACTER SET ascii -- 2 bytes
  population INT UNSIGNED -- 4 bytes
  city  -- AVG(LENGTH(city)) = 1+9.07 bytes

COUNT(*): 2,699,354  (the InnoDB estimate was not too far from this)

First index:  20    bytes * 2.7M rows = 54MB
Second index: 26.07 bytes * 2.7M rows = 70MB
Total:  124MB
Actual: 232MB
Ratio: 1.9x  (note: I skipped the "/0.67")

Aby udowodnić inny punkt, spróbowałem OPTIMIZE TABLE . Statystyki później były zasadniczo takie same:

+-------------+-------------------+-----------+-----------+-------+-----------+
| Approx Rows | Type              | Bytes     | Bytes/row | Pages | Rows/page |
+-------------+-------------------+-----------+-----------+-------+-----------+
|     2685828 | Data & PK         | 179077120 |        67 | 10930 |       246 |
|     2685828 | Secondary Indexes | 232341504 |        87 | 14181 |       189 |
+-------------+-------------------+-----------+-----------+-------+-----------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odświeżyć Datagrid w WPF

  2. Problem z dopasowaniem wielu zainteresowań w MySQL

  3. Dowiedz się, jak importować dane z Excela do bazy danych MySQL

  4. PreparedStatement ignoruje parametry w zapytaniu:java.sql.SQLException:Indeks parametru poza zakresem (1> liczba parametrów, czyli 0)

  5. Niestandardowa nazwa identyfikatora SailsJS i mySQL nie działa z niebieskimi wydrukami