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;

下面这个脚本加入了查询条件,找出表的记录数超过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';

原文始发于微信公众号(DBA闲思杂想录):MySQL如何找出没有索引或主键的表
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/227265.html