Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Có công thức nào để ước tính kích thước chỉ mục trong InnoDB không?

Trong InnoDB, PRIMARY KEY được nhúng với dữ liệu, vì vậy bạn có thể coi nó là không có dung lượng.

Đối với khóa phụ ... Hãy sử dụng công thức MyISAM, nhưng bao gồm các cột của cả hai khóa phụ và PRIMARY KEY . Sau đó nhân với 3. (Có rất nhiều chi phí.) Tuy nhiên, câu trả lời có thể bị lệch bởi hệ số 2 theo một trong hai hướng.

Lưu ý rằng nếu bạn có nhiều khóa phụ, kích thước của PK sẽ tạo ra sự khác biệt lớn trong không gian tổng thể cho bảng + chỉ mục.

Ví dụ

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

Đầu ra:

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

Bảng có hai chỉ mục:

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

Chỉ để chứng minh một quan điểm khác, tôi đã thử OPTIMIZE TABLE . Các số liệu thống kê sau đó về cơ bản giống nhau:

+-------------+-------------------+-----------+-----------+-------+-----------+
| 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. Tập lệnh PHP json_encode yêu cầu mysql không thể chuyển qua getJSON ()

  2. MySql:đặt một biến với một danh sách

  3. vòng lặp foreach php và nút addmore trong một biểu mẫu

  4. Ví dụ về WEEKOFYEAR () - MySQL

  5. APPARENT DEADLOCK Tạo chuỗi khẩn cấp cho các nhiệm vụ đang chờ xử lý chưa được giao