Найти дубликат индекса в MySQL с помощью запроса

0

Я знаю о утилите 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 ;
Теги:
indexing

2 ответа

2
Лучший ответ

Попробуйте выполнить следующий запрос:

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 ;
1

Невозможно найти неиспользуемые индексы. Есть несовершенные инструменты, предлагающие повторяющиеся индексы, но они зависят от просмотра того, какие индексы используются. Если у вас есть запрос, который вы запускаете только один раз в месяц, он может остаться незамеченным.

Моя книга повара содержит несколько советов. Вот некоторые распространенные ошибки:

  • Не "флаг" сам по себе; Оптимизатор, вероятно, никогда не будет использовать его.
  • Если у вас есть 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
  • 0
    очень хороший момент, индекс может находиться как в виде отдельного, так и составного ключевого индекса

Ещё вопросы

Сообщество Overcoder
Наверх
Меню