2011-08-29 368 views
3

我正在處理一個擁有大約300個表的數據庫,並且正在尋找一種方法來查找所有沒有索引的表(不包括PRIMARY)。理想情況下,我想返回一個結果集,它給出了每個表的索引數的計數。 我曾嘗試使用這種查詢是這樣的:如何找出哪些表在MySQL中沒有索引

SELECT 
    table_name, column_name, index_name, count(table_name) as index_count 
FROM 
    information_schema.statistics 
WHERE 
    index_name != 'primary' 
AND 
    table_schema = 'your_database' 
GROUP BY 
    table_name 

,但它不返回準確的結果。任何幫助,將不勝感激

+0

您確定結果不準確?我在我的數據庫上運行了這個查詢,這對我來說似乎是準確的。 –

回答

8

這將導致那些具有根本沒有索引的表(甚至主鍵)

select * from INFORMATION_SCHEMA.tables 
where table_schema = 'your_database' 
and table_name not in 
(
select table_name -- , count(*) 
from (
SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema = 'your_database' 
GROUP BY table_name, index_name) tab_ind_cols 
group by table_name 
) 
+0

@james,我知道在這個線程中你的下一個問題是什麼:「不包括PRIMARY」 – bpgergo

1

這將返回索引的數量爲所有表

select table_name, count(*) from (
SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema = 'your_database' 
GROUP BY table_name, index_name) tab_ind_cols 
group by table_name 
+0

不幸的是,這並沒有揭示哪些表沒有索引..只有那些索引 – james

1

的情況下,一個有用的工具,這樣也使MySQL的慢查詢日誌。您需要在my.cnf上啓用它,但因爲只有比設定的時間長的查詢纔會被記錄,所以即使在生產系統上也可以將其打開。

這樣做後,需要很長時間才能回答的查詢會被記錄下來,然後您可以查看是什麼讓它們變慢。

+0

已經在使用它,但它只是指出了事實後的查詢。我真的希望在出現問題之前趕上這些東西。 – james

4
select 
    t.table_schema,t.table_name,engine 
from 
    information_schema.tables t 
    inner join information_schema .columns c 
     on t.table_schema=c.table_schema and t.table_name=c.table_name 
group by 
    t.table_schema,t.table_name 
having 
    sum(if(column_key in ('PRI','UNI'), 1,0)) = 0; 

此選擇的作品,但它的回報,如果表是不是主要或唯一的

0

bpgergo,在這裏有一些東西。

,我相信這是你在找什麼

-- ============================================================================ 
-- TABLES WITHOUT INDICES BUT HAVE A PRIMARY KEY 
-- ============================================================================ 
SELECT * 
FROM INFORMATION_SCHEMA.TABLES AS MAIN_TABLE 
WHERE 
    TABLE_SCHEMA = 'your_database' 
    -- ============================================================================ 
    -- FIND TABLES WITH A PRIMARY KEY 
    -- ============================================================================ 
    AND TABLE_NAME IN (
       SELECT TABLE_NAME 
       FROM (
         SELECT TABLE_NAME, INDEX_NAME, COUNT(INDEX_NAME) AS TEST 
     FROM INFORMATION_SCHEMA.STATISTICS 
     WHERE TABLE_SCHEMA = 'your_database' 
       AND INDEX_NAME = 'PRIMARY' 
     GROUP BY TABLE_NAME , INDEX_NAME) AS TAB_IND_COLS 
    GROUP BY TABLE_NAME) 
    -- ============================================================================ 
    -- FIND TABLES WITH OUT ANY INDICES 
    -- ============================================================================ 
AND TABLE_NAME NOT IN (
     SELECT TABLE_NAME 
     FROM (
       SELECT TABLE_NAME, INDEX_NAME, COUNT(INDEX_NAME) AS TEST 
     FROM INFORMATION_SCHEMA.STATISTICS 
     WHERE TABLE_SCHEMA = 'your_database' 
       AND INDEX_NAME <> 'PRIMARY' 
     GROUP BY TABLE_NAME , INDEX_NAME) AS TAB_IND_COLS 
    GROUP BY TABLE_NAME 
    ) 
; 

你只需要改變your_database得到這個工作。

相關問題