MySQL如何找出没有索引或主键的表

MySQL中如何找出没有主键的表或者没有索引的表呢?有时候,我们在管理、维护MySQL时,可能经常遇到这方面的需求,下面分享几个脚本,以便不时之需。

如何找出没有索引的用户表,下面三个脚本基本上能满足你的各种需求了:

找出MySQL所有用户数据库中没有索引的表

/*-**************************************************************************************************
--  Script Name     :   find_without_index_tables.sql    
--  Script Funtion  :    找出MySQL所有用户数据库中没有索引的表
****************************************************************************************************/

SELECT t.table_schema
      ,t.table_name
      ,t.table_type
      ,t.engine
      ,t.table_rows
      ,t.row_format
      ,t.avg_row_length
      ,t.create_time
FROM information_schema.tables t
LEFT JOIN information_schema.statistics s
    ON t.table_schema = s.table_schema AND t.table_name = s.table_name
WHERE t.table_schema NOT IN ( 'mysql''information_schema''performance_schema''sys''ndbinfo'
  AND s.index_name IS NULL;

找出指定数据库中没有索引的表

/*-**************************************************************************************************
--  Script Name     :   find_without_index_tables.sql    
--  Script Funtion  :    找出指定数据库中没有索引的表
****************************************************************************************************/

set @db_name = 'kerry';
SELECT t.table_schema
      ,t.table_name
      ,t.table_type
      ,t.engine
      ,t.table_rows
      ,t.row_format
      ,t.avg_row_length
      ,t.create_time
FROM information_schema.tables t
LEFT JOIN information_schema.statistics s
    ON t.table_schema = s.table_schema AND t.table_name = s.table_name
WHERE t.table_schema=@db_name
  AND s.index_name IS NULL;
MySQL如何找出没有索引或主键的表

下面这个脚本加入了查询条件,找出表的记录数超过500,并且没有索引的表。因为,有时候数据库存在一些小表,可能只有 十几条或几十条记录,这些表没有索引也是合理和客观的。有时候可以忽略。

/*-**************************************************************************************************
--  Script Name     :   find_without_index_tables.sql    
--  Script Funtion  :   查询记录数超过500,没有索引的表。table_rows是个近似值,数据不精确,仅供参考
--                       MyISAM存储引擎的表值是准确的。          
****************************************************************************************************/

SELECT t.table_schema
      ,t.table_name
      ,t.table_type
      ,t.engine
      ,t.table_rows
      ,t.row_format
      ,t.avg_row_length
      ,t.create_time
FROM information_schema.tables t
LEFT JOIN information_schema.statistics s
    ON t.table_schema = s.table_schema AND t.table_name = s.table_name
WHERE t.table_schema NOT IN ( 'mysql''information_schema''performance_schema''sys''ndbinfo'
  AND s.index_name IS NULL
  AND t.table_rows >500;

下面几个SQL,用来找出没有主键的表,基本上能满足日常的大多数需求。

找出特定数据库中没有主键的表

/*-**************************************************************************************************
--  Script Name     :   find_without_pk_tables.sql    
--  Script Funtion  :   找出特定数据库中没有主键的表。          
****************************************************************************************************/


set @db_name = 'kerry';
SELECT
    t.table_schema,
    t.table_name
FROM
    information_schema.TABLES t
LEFT JOIN information_schema.TABLE_CONSTRAINTS c ON t.table_schema = c.TABLE_SCHEMA
AND t.table_name = c.TABLE_NAME
AND c.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
    c.table_name IS NULL
AND t.table_type = 'BASE TABLE'
AND t.TABLE_SCHEMA =@db_name;

找出实例下所有用户数据库中没有主键的表

/*-**************************************************************************************************
--  Script Name     :   find_without_pk_tables.sql    
--  Script Funtion  :   找出实例下所有用户数据库中没有主键的表。          
****************************************************************************************************/

SELECT
    t.table_schema,
    t.table_name
FROM
    information_schema.TABLES t
LEFT JOIN information_schema.TABLE_CONSTRAINTS c ON t.table_schema = c.TABLE_SCHEMA
AND t.table_name = c.TABLE_NAME
AND c.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
    c.table_name IS NULL
AND t.table_type = 'BASE TABLE'
AND t.TABLE_SCHEMA NOT IN (
    'information_schema',
    'performance_schema',
    'mysql',
    'sys'
);

找出实例下所有用户数据库中没有主键的表,这个SQL跟上面SQL的区别在于它使用的是视图information_schema.key_column_usage

/*-**************************************************************************************************
--  Script Name     :   find_without_pk_tables.sql    
--  Script Funtion  :   找出实例下所有用户数据库中没有主键的表          
****************************************************************************************************/

SELECT t.table_schema,
       t.table_name,
       k.constraint_name,
       k.column_name
FROM information_schema.tables t
     LEFT JOIN information_schema.key_column_usage k
          ON t.table_schema = k.table_schema
             AND t.table_name = k.table_name
             AND k.constraint_name = 'PRIMARY'
 WHERE t.table_schema NOT IN ( 'mysql''information_schema',
                               'sys','performance_schema' )
       AND k.constraint_name IS NULL
       AND t.table_type = 'BASE TABLE';
MySQL如何找出没有索引或主键的表


原文始发于微信公众号(DBA闲思杂想录):MySQL如何找出没有索引或主键的表

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/227265.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!