Как определить размер индексов в MySQL


88

Я хочу определить размер своих индексов, это индексы первичного ключа. Это происходит в кластере mysql, но я не думаю, что это важно.

Ответы:


99

Я думаю, это то, что вы ищете.

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 - все указываются в байтах, да.
Люк Реманн

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?
Alex

1
@Alex, поэтому он упорядочивается по 4-му полю, то есть по размеру. т.е. показывать сначала самую большую таблицу, а последнюю
Daniel Zohar

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уже умножается на размер страницы, поэтому столбец дает размер индекса в байтах.
Бенедикт Кёппель,

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

2

Используя phpMyAdmin, при просмотре структуры таблицы где-то внизу есть ссылка Подробности. Как только вы нажмете на него, он покажет вам общий размер индексов, которые у вас есть в таблице, где он отмечен как «Использование пространства».

Я не думаю, что он показывает вам каждый индекс индивидуально.


С phpMyAdmin это действительно просто. Спасибо!
MrFabio 03


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.