Як з’ясувати розмір індексів у MySQL


88

Я хочу визначити розмір своїх індексів, це індекси первинного ключа. Це трапляється в кластері mysql, але я не думаю, що це суттєво.

Відповіді:


99

Я думаю, це те, що ви шукаєте.

show table status from [dbname]

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


2
Так: середня довжина_рівні, довжина_даних, максимальна_дана_даних, довжина_індексу, дані_безкоштовно.
Luke Rehmann

23
Це дає загальний розмір індексу, а не розмір на індекс (припускаючи, що таблиця має кілька індексів).
Сай,

72

Розширюючи відповідь Вайка Гермеча.
Ось як ви можете отримати всі розміри індексів, у мегабайтах, без ПРИМАРНОГО (що є самою таблицею), упорядкованого за розміром.

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?
Олексій

1
@Alex, тому він замовляє 4-те поле, яке є розміром. тобто показати найбільшу таблицю першою, найменшу останню
Даніель Зохар

1
Чи не просто краще використовувати ORDER BY size_in_mb DESC;:?
NeverEndingQueue

1
@NeverEndingQueue це трохи питання стилю, але я бачу, як у цьому випадку це було б читабельніше. Я змінив відповідь, і тепер вона читається так, як ви запропонували.
Даніель Зоар,

42

Якщо ви використовуєте таблиці InnoDB, ви можете отримати розмір для окремих індексів із mysql.innodb_index_stats. Статистика "розмір" містить відповідь на сторінках, тому вам доведеться помножити її на розмір сторінки, який за замовчуванням становить 16 КБ .

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

1
Фантастично. Саме те, що я шукав!
Дейв Марторана

3
Для уточнення: за допомогою цього запиту значення stat_valueвже множиться на розмір сторінки, тому стовпець дає розмір індексу в байтах.
Benedikt Köppel,

2
Дякую, набагато краще за прийняту відповідь. Примітка для інших таких користувачів, як я, - ім'я_бази даних, ім'я таблиці та ім'я_індексу не слід замінювати вашим справжнім іменем бази даних та ім'ям таблиці;) замість цього слід використовувати саме таку команду, якою вона є.
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

З повагою Ліам


У мене є окремий випадок, коли для індексів PK відсоток показує значення понад 100, наприклад 1844 чи 677. Я думаю, у цих випадках є проблема із запитом.
Alex Pandrea

2

Використовуючи phpMyAdmin, під час перегляду структури таблиці десь внизу є посилання Details. Після того, як ви натиснете на нього, він покаже вам загальний розмір індексів, які ви маєте в таблиці, де він позначений простором.

Я не думаю, що він показує вам кожен індекс окремо.


За допомогою phpMyAdmin це дуже просто. Дякую!
MrFabio


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.