MySQL에서 인덱스 크기를 알아내는 방법


88

내 인덱스의 크기를 확인하고 싶습니다. 기본 키 인덱스입니다. 이것은 mysql 클러스터에 발생하지만 중요하다고 생각하지 않습니다.

답변:



72

Vajk Hermecz의 대답을 확장합니다.
이것이 크기별로 정렬 된 PRIMARY (테이블 자체)없이 모든 인덱스 크기 (MB)를 얻을 수있는 방법입니다.

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 2017

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 2016

3
명확히하기 위해 :이 쿼리에서는에 stat_value이미 페이지 크기가 곱 해져 있으므로 열은 인덱스 크기를 바이트 단위로 제공합니다.
Benedikt Köppel

2
받아 들인 대답보다 훨씬 낫습니다. 저와 같은 다른 멍청한 사람들에 대한 메모-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 인덱스의 경우 Percentage가 1844 또는 677과 같이 100 이상의 값을 표시하는 특별한 경우가 있습니다. 이러한 경우에 대한 쿼리에 문제가있는 것 같습니다.
알렉스 Pandrea

2

phpMyAdmin을 사용하면 테이블 구조를 볼 때 하단 어딘가에 세부 정보 링크가 있습니다. 클릭하면 공간 사용량으로 표시된 테이블에있는 인덱스의 총 크기가 표시됩니다.

그래도 각 색인을 개별적으로 보여주지는 않는다고 생각합니다.


phpMyAdmin을 사용하면 정말 쉽습니다. 감사합니다!
MrFabio


1

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.