Я знаю о утилите MySQL, называемой mysqlindexcheck. Но могу ли я найти повторяющиеся индексы с помощью SQL-запроса. Я попробовал это, но искал любую лучшую идею или улучшение
SELECT DISTINCT
TABLE_NAME,
COLUMN_NAME,
GROUP_CONCAT(DISTINCT INDEX_NAME)
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'db_name'
AND INDEX_NAME NOT IN ('PRIMARY')
GROUP BY COLUMN_NAME
HAVING count(DISTINCT INDEX_NAME)>1
ORDER BY TABLE_NAME ;
Попробуйте выполнить следующий запрос:
SELECT s.INDEXED_COL,GROUP_CONCAT(INDEX_NAME) FROM (
SELECT INDEX_NAME,GROUP_CONCAT(CONCAT(TABLE_NAME,'.',COLUMN_NAME) ORDER BY CONCAT(SEQ_IN_INDEX,COLUMN_NAME)) 'INDEXED_COL' FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db?'
GROUP BY INDEX_NAME
)as s GROUP BY INDEXED_COL HAVING COUNT(1)>1
Примечание. Это будет отличаться от двух составных клавиш в соответствии с порядком столбца
например: IND1 (col1, col2) и IND2 (col2, col1) будут рассматриваться как разные (не дублируемые) индексы
U может попробовать это (но это не будет работать для составного индекса):
SELECT DISTINCT
TABLE_NAME,
COLUMN_NAME,COUNT(1),
GROUP_CONCAT(DISTINCT INDEX_NAME)
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'db?'
AND INDEX_NAME NOT IN ('PRIMARY')
AND INDEX_NAME NOT IN (SELECT CONSTRAINT_NAME FROM 'REFERENTIAL_CONSTRAINTS')
GROUP BY TABLE_NAME,COLUMN_NAME
HAVING count(1)>1
ORDER BY TABLE_NAME ;
Невозможно найти неиспользуемые индексы. Есть несовершенные инструменты, предлагающие повторяющиеся индексы, но они зависят от просмотра того, какие индексы используются. Если у вас есть запрос, который вы запускаете только один раз в месяц, он может остаться незамеченным.
Моя книга повара содержит несколько советов. Вот некоторые распространенные ошибки:
INDEX(a,b)
, вам не нужен INDEX(a)
. Примечание. Инструменты могут не соответствовать этому правилу.INDEX(a)
, INDEX(b)
часто не так хорош, как INDEX(a,b)
, но вы не можете заменить оба предыдущих индекса на последний.INDEX(a(191))
ужасно. Пять обходных путей: здесь.Столбец может находиться как в одном столбце, так и в составном индексе. В некоторых таких ситуациях один индекс является избыточным. Но правила становятся сложными:
INDEX(a) -- Usually can be removed, even if used
INDEX(a, b)
UNIQUE(c) -- Not redundant
UNIQUE(c, d) -- Can change to INDEX(c, d)
PRIMARY KEY(e)
INDEX(e, ...) -- Usually redundant
INDEX(x(123)) -- Rarely useful, even when you think it would be