2016-03-05 74 views

回答

0

我在網上搜索,我找不到明確的答案這個問題。然後,我想在這裏發佈我的解決方案。我希望有人會覺得它有用。 此腳本也可幫助您檢測組合索引。 想象一下,我們有一個Employee表和一個id列作爲主鍵。 我們希望找到引用Employee .id`的數據庫中的所有索引(單個和複合)。

SELECT 
    stat.TABLE_NAME, 
    stat.INDEX_NAME, 
    stat.COLUMN_NAME, 
    stat.SEQ_IN_INDEX, 
    statAll.`COMPOSITE` 
FROM 
information_schema.KEY_COLUMN_USAGE keyUsage 
JOIN INFORMATION_SCHEMA.STATISTICS stat 
    ON (keyUsage.TABLE_NAME = stat.TABLE_NAME AND keyUsage.COLUMN_NAME = stat.COLUMN_NAME) 

JOIN (SELECT 
     TABLE_NAME, 
     INDEX_NAME, 
     IF (COUNT(*) > 1, true, false) `COMPOSITE` 
     FROM 
     INFORMATION_SCHEMA.STATISTICS 
     WHERE 
     TABLE_SCHEMA = (SCHEMA()) 
     GROUP BY 
     TABLE_NAME, 
     INDEX_NAME) statAll 
    ON (statAll.TABLE_NAME = keyUsage.TABLE_NAME AND statAll.INDEX_NAME = stat.INDEX_NAME) 


WHERE 
keyUsage.REFERENCED_TABLE_NAME in ('Employee') -- Table Name 
AND keyUsage.REFERENCED_COLUMN_NAME = 'id' -- Column Name 
AND keyUsage.TABLE_SCHEMA = (SCHEMA()) 

GROUP BY 
    stat.TABLE_NAME, 
    stat.INDEX_NAME, 
    stat.COLUMN_NAME, 
    stat.SEQ_IN_INDEX 

ORDER BY keyUsage.REFERENCED_TABLE_NAME, keyUsage.TABLE_NAME; 

其結果是,在不同的表索引列表。每一行都包含下列數據:

  • TABLE_NAME:在索引定義的表,
  • INDEX_NAME:該表中的索引名,
  • COLUMN_NAME:在表的外鍵列名,
  • SEQ_IN_INDEX:索引中列的序號,
  • COMPOSITE:表示參與列位於組合鍵中的標誌。它顯示索引是複合還是單一。
0

這似乎有點短:

select s.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,s.`TABLE_NAME` AS `TABLE_NAME`, 
     s.`INDEX_NAME` AS `INDEX_NAME`,max(s.`NON_UNIQUE`) AS `non_unique`, 
     max(if(isnull(s.`SUB_PART`),0,1)) AS `subpart_exists`, 
     group_concat(s.`COLUMN_NAME` 
      order by s.`SEQ_IN_INDEX` ASC separator ',' 
        ) AS `index_columns` 
    FROM `information_schema`.`statistics` AS s2 
    JOIN `information_schema`.`statistics` AS s 
      USING (TABLE_SCHEMA, TABLE_NAME, INDEX_NAME) 
    WHERE s2.TABLE_SCHEMA = SCHEMA() 
     AND s2.TABLE_NAME = '...' 
     AND s2.COLUMN_NAME = '...' 
    group by s.`TABLE_SCHEMA`,s.`TABLE_NAME`,s.`INDEX_NAME`; 

SEQ_IN_INDEX和複合是在我index_columns,其重建列列表隱。