代码改变世界

找出MySQL库中设计不好的Schemas并修复

  abce  阅读(65)  评论(0编辑  收藏  举报

使用以下脚本,找出数据库中设计不好的Schemas并修复

 

— 找出没有主键的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
  t.table_schema,
  t.table_name,
  t.ENGINE
FROM
  information_schema.TABLES t
JOIN information_schema.COLUMNS c ON t.table_schema = c.table_schema
AND t.table_name = c.table_name
WHERE
  t.table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' )
AND t.table_type = 'BASE TABLE'
GROUP BY
  t.table_schema,
  t.table_name,
  t.ENGINE
HAVING
  SUM(IF( column_key IN ('PRI','UNI' ), 1, 0 )) = 0;

 

— 找出主键不是整型类型的表

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  table_schema,
  table_name,
  column_name,
  data_type,
  character_maximum_length
FROM
  information_schema.COLUMNS
WHERE
  column_key IN ('PRI',' UNI' )
AND ordinal_position = 1
AND data_type NOT IN ('TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'BIGINT', 'TIMESTAMP', 'DATETIME' )
AND table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' );

 

— 找出不是innodb存储引擎的表

1
2
3
4
5
6
7
8
9
10
SELECT
  t.table_schema,
  t.table_name,
  t.ENGINE
FROM
  information_schema.TABLES t
WHERE
  t.table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' )
AND t.ENGINE <> 'INNODB'
AND t.table_type = 'BASE TABLE';

 

— 查找时延最大的表和索引

1
2
3
4
5
6
7
SELECT
  *
FROM
  sys.schema_table_statistics
WHERE
  table_schema ='abce'
AND table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' );

 

1
2
3
4
5
6
7
SELECT
  *
FROM
  sys.schema_index_statistics
WHERE
  table_schema ='abce'
AND table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' );

 

— 找出索引大小大于表数据的50%的表

1
2
3
4
5
6
7
8
9
10
11
SELECT
  table_schema,
  table_name,
  index_length,
  data_length,
  index_length / data_length AS index_to_data_ratio
FROM
  information_schema.TABLES
WHERE
  table_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' )
AND INDEX_LENGTH > DATA_LENGTH * 1.5;

 

— 找出有重复索引的表

1
2
3
4
5
6
7
8
9
10
11
SELECT
  table_schema,
  table_name,
  redundant_index_name AS redundant_index,
  redundant_index_columns AS redundant_columns,
  dominant_index_name AS covered_by_index,
  sql_drop_index
FROM
  sys.schema_redundant_indexes
WHERE
  table_schema NOT IN ( 'mysql', 'information_schema', 'sys', 'performance_schema' );

 

— 找出没被使用的索引

1
2
3
4
5
6
SELECT
  *
FROM
  sys.schema_unused_indexes
WHERE
  object_schema NOT IN ('mysql', 'information_schema', 'sys', 'PERFORMANCE_SCHEMA' );
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-10-20 ‘Found duplicate PV’ warnings when using LVM with multipath storage in RHEL/CentOS
点击右上角即可分享
微信分享提示