วิธีหาขนาดของดัชนีใน MySQL


88

ฉันต้องการกำหนดขนาดของดัชนีของฉันซึ่งเป็นดัชนีคีย์หลัก สิ่งนี้เกิดขึ้นบนคลัสเตอร์ mysql แต่ฉันไม่คิดว่ามันสำคัญ

คำตอบ:


100

ฉันคิดว่านี่คือสิ่งที่คุณกำลังมองหา

show table status from [dbname]

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html


2
Avg_row_length, Data_length, Max_data_length, Index_length, Data_free ทั้งหมดจะถูกรายงานเป็นไบต์ใช่
Luke Rehmann

23
สิ่งนี้ให้ขนาดดัชนีทั้งหมดไม่ใช่ขนาดต่อดัชนี (สมมติว่าตารางมีหลายดัชนี)
สาย

76

ขยายคำตอบของ Vajk Hermecz
นี่คือวิธีที่คุณจะได้รับขนาดดัชนีทั้งหมดเป็นเมกะไบต์โดยไม่ใช้ PRIMARY (ซึ่งก็คือตารางนั่นเอง) เรียงตามขนาด

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
ทำไมต้องสั่งซื้อ 4?
Alex

1
@ อเล็กซ์จึงสั่งตามฟิลด์ที่ 4 ซึ่งเป็นขนาด คือแสดงตารางที่ใหญ่ที่สุดก่อนเล็กที่สุด
Daniel Zohar

1
มันไม่ดีกว่าที่จะใช้: ORDER BY size_in_mb DESC;?
NeverEndingQueue

1
@NeverEndingQueue เป็นเรื่องของสไตล์ แต่ฉันเห็นว่าในกรณีนี้จะอ่านได้ง่ายขึ้น ฉันได้แก้ไขคำตอบแล้วและตอนนี้อ่านตามที่คุณแนะนำแล้ว
Daniel Zohar

42

หากคุณกำลังใช้ตาราง InnoDB mysql.innodb_index_statsคุณจะได้รับขนาดสำหรับดัชนีบุคคลจาก ว่า 'ขนาด' สถิติมีคำตอบในหน้าดังนั้นคุณต้องคูณด้วยหน้าขนาดซึ่งเป็น 16K โดยค่าเริ่มต้น

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

1
ยอดเยี่ยม. สิ่งที่ฉันกำลังมองหา!
Dave Martorana

3
เพื่อชี้แจง: เมื่อใช้แบบสอบถามนี้ค่าstat_valueจะถูกคูณด้วยขนาดหน้าแล้วดังนั้นคอลัมน์จึงให้ขนาดดัชนีเป็นไบต์
Benedikt Köppel

2
ขอบคุณมากดีกว่าคำตอบที่ยอมรับ หมายเหตุสำหรับ noobs อื่น ๆ เช่นฉัน - database_name, table_name และ index_name จะไม่ถูกแทนที่ด้วยชื่อฐานข้อมูลจริงและชื่อตารางของคุณ;) ควรใช้คำสั่งแทนทุกประการ
luben

ในกรณีของฉันมันให้ขนาดที่แตกต่างกันมาก (และไม่สมจริง) จากขนาดที่รายงานโดยshow table status from [dbname]
สถาปัตยกรรม

6

ในMyISAMแต่ละบล็อกดัชนีจะ4 KBเต็มไปfill_factorด้วยระเบียนดัชนีแต่ละหน้าที่key length + 4ยาวไบต์

Fill factor เป็นปกติ 2/3

สำหรับInnoDBตารางจะถูกรวมกลุ่มไว้เสมอPRIMARY KEYไม่มีPRIMARY KEYดัชนีแยกต่างหาก


6

นี่คือการปรับตัวจากบางส่วนข้างต้นเพื่อให้คุณได้เปอร์เซ็นต์ของดัชนีทั้งหมดสำหรับตารางที่แต่ละดัชนีใช้หวังว่าจะเป็นประโยชน์สำหรับใครบางคน

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'

ตัวอย่างผลลัพธ์

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

ขอแสดงความนับถือ Liam


ฉันมีบางกรณีที่สำหรับดัชนี PK เปอร์เซ็นต์แสดงค่ามากกว่า 100 เช่น 1844 หรือ 677 ฉันเดาว่ามีปัญหากับข้อความค้นหาสำหรับกรณีเหล่านั้น
Alex

2

การใช้ phpMyAdmin เมื่อดูโครงสร้างตารางจะมีลิงค์รายละเอียดที่ด้านล่างที่ไหนสักแห่ง เมื่อคุณคลิกมันจะแสดงขนาดทั้งหมดของดัชนีที่คุณมีบนตารางซึ่งมีการทำเครื่องหมาย Space Usage

ฉันไม่คิดว่ามันจะแสดงดัชนีแต่ละรายการให้คุณเห็น


ด้วย phpMyAdmin นั้นง่ายมาก ขอขอบคุณ!
MrFabio


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.