Найти дубликат индекса в MySQL с помощью запроса - PullRequest
0 голосов
/ 26 июня 2018

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

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 ;
0 голосов
/ 26 июня 2018

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

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

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