使用查询查找 MySQL 中的重复索引

Kou*_*jee 3 mysql indexing

我知道名为mysqlindexcheck的 MySQL 实用程序。但是我可以通过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 ;
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试以下查询:

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
Run Code Online (Sandbox Code Playgroud)

注意:这将按照列顺序区分两个复合键

例如:IND1(col1,col2) 和 IND2(col2,col1) 将被视为不同(不重复)索引

你可以尝试这个(但这不适用于复合索引):

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 INFORMATION_SCHEMA.`REFERENTIAL_CONSTRAINTS`)
    GROUP BY TABLE_NAME,COLUMN_NAME
    HAVING count(1)>1
    ORDER BY TABLE_NAME ;
Run Code Online (Sandbox Code Playgroud)