Cách ước tính / dự đoán kích thước dữ liệu và kích thước chỉ mục của bảng trong MySQL


26

Tôi đang tìm cách tốt nhất để ước tính kích thước của bảng mà tôi đã nghiên cứu rất nhiều blog và diễn đàn nhưng không thể tìm thấy câu trả lời chính xác nào

Ví dụ, chúng ta có một bảng Thành phố với công cụ InnoDB , giả sử trong tương lai (trong 1 năm tới), nó sẽ có 1 triệu bản ghi, vậy kích thước dữ liệu ước tính và kích thước chỉ mục của bảng đó trong giai đoạn này là gì.

mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

CẬP NHẬT

Điều gì sẽ là giới hạn trên ước tính (kích thước tối đa của bảng) với 1 triệu bản ghi và làm thế nào chúng ta có thể ước tính nó.


Điều đó thật tuyệt. nhưng có thể có được cột kích thước chỉ mục khôn ngoan. Có nghĩa là gì nếu bạn có một bảng với (5) cột được lập chỉ mục. Chúng ta có thể có được kích thước chỉ mục của từng người trong số họ? Tôi sẽ hỏi điều này như một câu hỏi khác. cảm ơn
Sushil

Câu trả lời:


51

Đưa ra mô tả bảng, tôi thấy

  • 66 byte mỗi hàng dữ liệu
  • 4 byte mỗi hàng cho khóa chính
  • 7 byte mỗi hàng cho chỉ mục mã quốc gia
    • 3 byte cho đất nước
    • 4 byte cho Khóa cụm được gắn vào mã quốc gia
  • Tổng cộng 77 byte dữ liệu và khóa
  • Điều này không bao gồm việc dọn phòng cho BTREE hoặc phân mảnh không gian bảng

Đối với một triệu hàng, đó sẽ là 77.000.000 byte (73,43 MB)

Đối với việc đo bảng, đối với một bảng đã cho mydb.mytable, bạn có thể chạy truy vấn này

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(data_length+index_length)/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

Để đo tất cả các bảng được nhóm bởi Cơ sở dữ liệu và Công cụ lưu trữ

SELECT
    IF(ISNULL(DB)+ISNULL(ENGINE)=2,'Database Total',
    CONCAT(DB,' ',IFNULL(ENGINE,'Total'))) "Reported Statistic",
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size",
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size",
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"
FROM
(
    SELECT DB,ENGINE,DAT,NDX,TBL,
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (SELECT *,
        FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px,
        FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py,
        FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz
    FROM
    (SELECT
        DB,ENGINE,
        SUM(data_length) DAT,
        SUM(index_length) NDX,
        SUM(data_length+index_length) TBL
    FROM
    (
       SELECT table_schema DB,ENGINE,data_length,index_length FROM
       information_schema.tables WHERE table_schema NOT IN
       ('information_schema','performance_schema','mysql')
       AND ENGINE IS NOT NULL
    ) AAA GROUP BY DB,ENGINE WITH ROLLUP
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B;

Chạy các truy vấn này và bạn có thể theo dõi các thay đổi trong việc sử dụng đĩa cơ sở dữ liệu / động cơ.

Hãy thử một lần !!!


1
Đây là một truy vấn thực sự tuyệt vời để xem tất cả các kích thước bảng của bạn.
ghayes

Độ CHARdài cần được nhân với 3 nếu bạn có CHARSET utf8. Toàn bộ chi phí có thể được ước tính bằng cách nhân đôi hoặc nhân ba tính toán.
Rick James

@RolandoMySQLDBA, bạn có biết nếu có thể tính kích thước hàng "thực" của bảng với mục tiêu để so sánh với kích thước thực (bảng nén) và lấy tỷ lệ nén không?
ceinmart

@ceinmart innodb_page_size được cố định (16K hoặc 16384 theo mặc định) và trở thành ranh giới nơi các hàng và được nhóm hoặc tách. Thay đổi innodb_page_size có thể thay đổi việc lưu trữ dữ liệu tốt hoặc xấu. Dựa trên mức độ đầy hoặc thưa của một hàng (đặc biệt là với sự hiện diện của TEXT / BLOB / VARCHAR). Tốt nhất, bạn nên so sánh kích thước của tệp .ibd với báo cáo lược đồ để ước tính tỷ lệ. Bạn cũng có thể cần thực hiện NULL ALTER TABLE ( ALTER TABLE ... ENGINE=InnoDB;) để có tỷ lệ chính xác. Nỗ lực có thể không đáng
RolandoMySQLDBA

@ceinmart Hãy nhớ rằng việc thay đổi mũ innodb_page_size không phải là cài đặt theo từng bảng. Bạn sẽ cần thực hiện xuất toàn bộ dữ liệu (Xem mariadb.com/kb/en/l Library / how-to-change-innodb_page_size )
RolandoMyQueryDBA

4

Nếu bạn đang sử dụng bảng InnoDB, bạn có thể lấy kích thước cho các chỉ mục dữ liệu / riêng lẻ từ đó mysql.innodb_index_stats. Chỉ số 'size' chứa câu trả lời, trong các trang, do đó bạn phải nhân nó với kích thước trang, theo mặc định là 16K .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';

Chỉ số CHÍNH là dữ liệu.


1
Điều này giả sử bạn có dữ liệu trong bảng; có vẻ như OP muốn ước tính trước khi đưa vào.
Rick James

0
SELECT  Table_NAME "tablename",
           data_length   "table data_length in Bytes",
           index_length  "table index_length in Bytes",
           data_free  "Free Space in Bytes"
    FROM  information_schema.TABLES  where  Table_schema = 'databasename';

bằng cách thực hiện truy vấn này, bạn có thể nhận được kích thước được sử dụng cho DataIndexcủa một bảng, Bạn có thể kiểm tra kích thước này với # hàng và dự đoán cho 1 triệu hàng


1
Tôi không chắc chắn nhưng điều này sẽ cho một số kết quả chính xác? bạn đã thử cái này bao giờ chưa?
Abdul Manaf

Trên thực tế tôi đang kiểm tra kết quả truy vấn này định kỳ để xem kích thước tăng trưởng (%)
Peter Venderberghe

0

Nếu bạn chưa có dữ liệu, đây là một số mẹo. Những điều sau đây áp dụng cho InnoDB. (MyISAM đơn giản hơn nhiều và nhỏ hơn.)

Đừng sử dụng CHARcho các cột có chiều dài thay đổi. Bạn CHARACTER SETđang sử dụng cái gì Ascii cần một byte cho mỗi ký tự; utf8mb4 cần từ 1 đến 4.

4 bytes per INT
35 for CHAR(35), if ascii or latin1; varchar is probably less
3 for the country code; it is fixed length
etc

Tổng cộng = khoảng 80 byte.

Nhân số 80 với từ 2 đến 3 để tính các chi phí khác nhau. Nhiều khả năng bảng hàng 1M sẽ nằm trong khoảng từ 160MB đến 240MB.

Để đo một chỉ mục, giả sử CountryCodecó 3 byte:

3 bytes data
4 bytes for the PK (implicitly included with any secondary key)
25 bytes basic overhead
32 total
times 1.5 -- overhead for BTree that was randomly inserted into
48MB -- total for 1M rows.

Ghi chú:

  • Chỉ các nút lá (của BTrees) cần được tính toán; chi phí cho các nút không lá thường là 1%.

  • Các PRIMARY KEYlà "cụm" với các dữ liệu, do đó không cần phải tính toán nó.

  • Nếu bạn không có PK rõ ràng, thì bạn cần thêm 6 byte vào kích thước hàng để cho phép PK được chế tạo.

  • ROW_FORMAT = COMPRESSEDcung cấp cho bạn về độ co 2: 1. (Điều này không tốt bằng tỷ lệ nén thông thường của zip (v.v.) là 3: 1.)

  • SHOW TABLE STATUS LIKE "tablename";là cách nhanh chóng để tính kích thước 'thực tế'. Xem Data_lengthdữ liệu và PK; Index_lengthcho các chỉ số phụ, và Data_freecho một số thứ khác.

  • Rất hiếm Index_lengthkhi vượt quá Data_length. Tuy nhiên, điều đó không "sai" khi điều đó xảy ra.


-1

Thật tẻ nhạt. Nhưng các chi tiết là trong các tài liệu .

Để chính xác nhất có thể, điều hiếm khi cần thiết, bạn cũng cần đọc về cấu trúc bảng và cấu trúc chỉ mục.

Nếu tôi ở trong đôi giày của bạn, tôi sẽ xây dựng bảng, điền vào đó một triệu hàng dữ liệu thử nghiệm và đo lường sự thay đổi kích thước. Tùy thuộc vào ứng dụng của bạn, bạn cũng có thể cần phải đưa kích thước của tệp nhật ký giao dịch vào tài khoản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.