Cách tìm ra kích thước của các Chỉ mục trong MySQL


88

Tôi muốn xác định kích thước các chỉ mục của mình, chúng là các chỉ mục khóa chính. Điều này xảy ra trên cụm mysql nhưng tôi không nghĩ rằng điều đó là đáng kể.

Câu trả lời:



72

Mở rộng câu trả lời của Vajk Hermecz.
Đây là cách bạn có thể nhận được tất cả kích thước chỉ mục, tính bằng megabyte, mà không cần CHÍNH (chính là bảng), được sắp xếp theo kích thước.

SELECT database_name, table_name, index_name,
ROUND(stat_value * @@innodb_page_size / 1024 / 1024, 2) size_in_mb
FROM mysql.innodb_index_stats
WHERE stat_name = 'size' AND index_name != 'PRIMARY'
ORDER BY size_in_mb DESC;

1
Tại sao lại ĐẶT HÀNG THEO 4?
Alex,

1
@Alex để nó đặt hàng theo trường thứ 4, đó là kích thước. tức là hiển thị bảng lớn nhất đầu tiên, nhỏ cuối cùng
Daniel Zohar

1
Không chỉ đơn giản là tốt hơn khi sử dụng ORDER BY size_in_mb DESC;:?
NeverEndingQueue

1
@NeverEndingQueue có một chút vấn đề về phong cách nhưng tôi có thể thấy trong trường hợp này nó sẽ dễ đọc hơn như thế nào. Tôi đã sửa đổi câu trả lời và bây giờ nó đọc như bạn đề xuất.
Daniel Zohar

42

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 riêng lẻ từ đó mysql.innodb_index_stats. Thống kê 'kích thước' chứa câu trả lời, trong các trang, vì vậy 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';

1
Tuyệt diệu. Chính xác những gì tôi đang tìm kiếm!
Dave Martorana

3
Để làm rõ: Với truy vấn này, giá trị stat_valueđã được nhân với kích thước trang, vì vậy cột cung cấp kích thước chỉ mục tính bằng byte.
Benedikt Köppel

2
Cảm ơn bạn, tốt hơn nhiều so với câu trả lời được chấp nhận. Một lưu ý cho những người khác như tôi - database_name, table_name và index_name không được thay thế bằng tên cơ sở dữ liệu thực và tên bảng của bạn;) thay vào đó, lệnh phải được sử dụng chính xác.
luben, 27/07/17

trong trường hợp của tôi nó đã đưa ra một kích thước rất khác nhau (và không thực tế) từ một báo cáo củashow table status from [dbname]
có kiến trúc

6

Trên MyISAM, mỗi khối chỉ mục là 4 KBtrang chứa đầy fill_factorcác bản ghi chỉ mục, mỗi bản ghi key length + 4dài byte.

Fill factor là bình thường 2/3

Đối với InnoDB, bảng luôn được nhóm trên PRIMARY KEY, không có PRIMARY KEYchỉ mục riêng


6

Đây là một sự điều chỉnh từ một số điều ở trên để cung cấp cho bạn tỷ lệ phần trăm của tổng chỉ mục cho bảng mà mỗi chỉ mục đã sử dụng, hy vọng điều này sẽ hữu ích cho ai đó

select 
    database_name, 
    table_name, 
    index_name, 
    round((stat_value*@@innodb_page_size)/1024/1024, 2) SizeMB, 
    round(((100/(SELECT INDEX_LENGTH FROM INFORMATION_SCHEMA.TABLES t WHERE t.TABLE_NAME = iis.table_name and t.TABLE_SCHEMA = iis.database_name))*(stat_value*@@innodb_page_size)), 2) `Percentage`
from mysql.innodb_index_stats iis 
where stat_name='size' 
and table_name = 'TargetTable'
and database_name = 'targetDB'

Ví dụ đầu ra

database_name   table_name  index_name  SizeMB  Percentage
targetDB        TargetTable id          10      55.55
targetDB        TargetTable idLookup    5       27.77
targetDB        TargetTable idTest      3       16.66

Trân trọng Liam


Tôi có một trường hợp cụ thể trong đó đối với PK lập chỉ mục Phần trăm hiển thị các giá trị trên 100, như 1844 hoặc 677. Tôi đoán có vấn đề với truy vấn cho những trường hợp đó.
Alex Pandrea vào

2

Sử dụng phpMyAdmin, khi xem cấu trúc bảng có liên kết Chi tiết ở phía dưới cùng ở đâu đó. Khi bạn nhấp vào nó, nó sẽ hiển thị cho bạn tổng kích thước của các chỉ mục bạn có trên bảng nơi nó được đánh dấu Sử dụng không gian.

Tôi không nghĩ rằng nó hiển thị cho bạn từng chỉ mục riêng lẻ.


Với phpMyAdmin, điều đó thực sự dễ dàng. Cảm ơn bạn!
MrFabio


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.