Як бачити індекси для бази даних або таблиці в MySQL?


486

Як я бачу, чи в моїй базі даних є якісь індекси?

Як щодо конкретної таблиці?


просто використовуйте: sp_helpindex 'ім'я таблиці'
user3772443

"просто використовуйте: sp_helpindex 'ім'я таблиці'", що здається, що це SQL Server (MSSQL) @ user3772443, а не MySQL
Raymond Nijland

Відповіді:


794

Щоб побачити індекс для певної таблиці, використовуйте SHOW INDEX:

SHOW INDEX FROM yourtable;

Щоб побачити індекси для всіх таблиць у певній схемі, ви можете використовувати таблицю STATISTICS з INFORMATION_SCHEMA:

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

Видалення пункту де покаже вам всі індекси у всіх схемах.


10
Зауважте, що DISTINCTключове слово маскує деякі індекси - у мене є таблиця, де індекс має те саме ім'я, але використовується у двох різних стовпцях, тому приклад інформаційної схеми тут покаже лише один індекс.
Бен

Мені довелося додати, from mydbяк показано у відповіді LiorK.
Нейт

@Mark Byers Чи є спосіб побачити саму таблицю індексів? Як SQL генерує індексний файл внутрішньо? Як він зберігає вказівник запису з таблиці індексів до головної таблиці?
yajant b

Отже, моя таблиця відображається в INFORMATION_SCHEMA.STATISTICS, але вона має лише один запис, ім'я_індексу. Немає додаткового запису, який би вказував назву стовпця. Усі інші таблиці містять кілька записів, які показують щось подібне: ПЕРШИЙ c1, c2 де c1, c2 складають первинний ключ. Будь-яка ідея чому?
Stevers

56

Якщо ви хочете одразу побачити всі індекси у всіх базах даних:

use information_schema;
SELECT * FROM statistics;

4
Як однострочнікі:SELECT * FROM information_schema.statistics;
енгармонічні


7

Ви можете використовувати цей запит, щоб отримати номер індексів, а також імена індексів кожної таблиці у визначеній базі даних.

SELECT TABLE_NAME,
       COUNT(1) index_count,
       GROUP_CONCAT(DISTINCT(index_name) SEPARATOR ',\n ') indexes
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
      AND INDEX_NAME != 'primary'
GROUP BY TABLE_NAME
ORDER BY COUNT(1) DESC;

5

Я пропоную цей запит:

SELECT DISTINCT s.*
FROM INFORMATION_SCHEMA.STATISTICS s
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t 
    ON t.TABLE_SCHEMA = s.TABLE_SCHEMA 
       AND t.TABLE_NAME = s.TABLE_NAME
       AND s.INDEX_NAME = t.CONSTRAINT_NAME 
WHERE 0 = 0
      AND t.CONSTRAINT_NAME IS NULL
      AND s.TABLE_SCHEMA = 'YOUR_SCHEMA_SAMPLE';

Ви знайшли весь індекс лише для індексу.

З повагою.


3

Для отримання всіх індексованих стовпців на індекс в одному стовпці в порядку послідовності.

SELECT table_name AS `Table`,
       index_name AS `Index`,
       GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics
WHERE table_schema = 'sakila'
GROUP BY 1,2;

Посилання: http://blog.9minutesnooze.com/mysql-information-schema-indexes/


2

Щоб перевірити всі відключені індекси на db

SELECT INDEX_SCHEMA, COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'mydb'
AND COMMENT = 'disabled'

2

Ви можете перевірити свої індекси на MySQL workbench. під вкладками звітів про ефективність ви можете побачити всі використані індекси та невикористані індекси в системі. або ви можете запустити запит.

select * from sys.schema_index_statistics;

Пол, який інструмент ви використовуєте? Цей код працює в mysql workbeanch.
Ганеш Гірі

Я використав це в оболонці MySQL
Павло Басенко

Чи можете ви спробувати це за допомогою Mysql Workbench. виберіть * з sys.schema_index_statistics;
Ганеш Гірі

2

Це працює в моєму випадку для отримання імені таблиці та імені стовпця у відповідній таблиці для індексованих полів.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.