【问题标题】:How do I find out which tables have no indexes in MySQL如何找出 MySQL 中哪些表没有索引
【发布时间】:2011-08-29 17:40:49
【问题描述】:

我正在处理一个包含大约 300 个表的数据库,并且我正在寻找一种方法来查找所有没有索引的表(不包括 PRIMARY)。理想情况下,我想取回一个结果集,让我计算每个表的索引数。 我已经尝试过使用这样的查询:

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

但它不会返回准确的结果。任何帮助将不胜感激

【问题讨论】:

  • 您确定结果不准确吗?我在我的数据库上运行了该查询,它对我来说似乎是准确的。

标签: mysql sql indexing


【解决方案1】:

这将导致那些根本没有索引(甚至没有主键)的表

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
)

【讨论】:

  • @james,我知道你在这个线程中的下一个问题是什么:“不包括 PRIMARY”
【解决方案2】:

这将返回所有表的索引数

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

【讨论】:

  • 不幸的是,这并没有显示哪些表没有索引..只有那些有索引的表
【解决方案3】:

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 即可使其正常工作。

【讨论】:

    【解决方案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;
    

    此选择有效,但如果表不是 PRIMARY 或 Unique 则返回

    【讨论】:

      【解决方案5】:

      在这种情况下,一个有用的工具也是启用 MySQL 慢查询日志。您需要在 my.cnf 上启用它,但由于只记录花费超过设定时间的查询,因此即使在生产系统上也可以保持开启状态。

      有了这个,需要很长时间才能回答的查询会被记录下来,然后您就可以看到是什么让它们变慢了。

      【讨论】:

      • 已经在使用它,但它只在事后指出查询。我真的很想在它成为问题之前抓住一些这样的东西。
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多