2011-08-29 54 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得到这个工作。