Как выяснить размер индексов в MySQL - PullRequest
69 голосов
/ 23 апреля 2009

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

Ответы [ 8 ]

88 голосов
/ 22 сентября 2009

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

show table status from [dbname]

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

39 голосов
/ 12 апреля 2016

Расширяя ответ Вайка Хермеча.
Вот как вы можете получить все размеры индексов в мегабайтах без 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 4 DESC;
31 голосов
/ 23 октября 2015

Если вы используете таблицы InnoDB, вы можете получить размер для отдельных индексов от mysql.innodb_index_stats. Статистика «size» содержит ответ в страницах, поэтому его нужно умножить на размер страницы, , что по умолчанию равно 16 КБ .

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
5 голосов
/ 23 апреля 2009

В MyISAM каждый индексный блок - это 4 KB страница, заполненная до fill_factor индексными записями, каждая из которых имеет длину key length + 4 байт.

Fill factor обычно 2/3

Что касается InnoDB, таблица всегда кластеризована на PRIMARY KEY, отдельного PRIMARY KEY index

нет
2 голосов
/ 04 апреля 2015

В этой статье определите, как рассчитать размер индекса. http://aadant.com/blog/2014/02/04/how-to-calculate-a-specific-innodb-index-size/

2 голосов
/ 23 апреля 2009

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

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

1 голос
/ 22 мая 2018

Вот адаптация некоторых из вышеперечисленных, чтобы также дать вам процент от общего индекса для таблицы, которую использовал каждый индекс, надеюсь, это будет кому-то полезно

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

С уважением Лиам

0 голосов
/ 29 сентября 2018

Из справки MySQL 5.6

SELECT SUM(stat_value) pages, index_name,
SUM(stat_value)*@@innodb_page_size size
FROM mysql.innodb_index_stats WHERE table_name='t1'
AND stat_name = 'size' GROUP BY index_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...