成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起揪出那個無主鍵的表

數據庫 MySQL
在 MySQL 中,建表時一般都會要求有主鍵。若要求不規范難免會出現幾張無主鍵的表,本篇文章讓我們一起揪出那個無主鍵的表。

[[410364]]

本文轉載自微信公眾號「MySQL技術」,作者MySQL技術。轉載本文請聯系MySQL技術公眾號。

前言:

在 MySQL 中,建表時一般都會要求有主鍵。若要求不規范難免會出現幾張無主鍵的表,本篇文章讓我們一起揪出那個無主鍵的表。

1.無主鍵表的危害

以 InnoDB 表為例,我們都知道,在 InnoDB 中,表都是根據主鍵順序以索引的形式存放的,這種存儲方式的表稱為索引組織表。一張 InnoDB 表必須有一個聚簇索引,當有主鍵時,會以主鍵作為聚簇索引;如果沒有顯式定義主鍵,InnoDB 會選擇一個唯一的非空索引代替。如果沒有這樣的索引,則 MySQL 自動為 InnoDB 表生成一個隱含字段作為主鍵。

也就是說,最好我們可以顯式定義主鍵,那么無主鍵表可能會產生哪些危害呢?首先沒有主鍵就意味著無法用到主鍵索引,可能影響查詢效率。其次是對維護不友好,比如想升級為 MGR 集群或使用某些開源工具時,都會要求表要有主鍵。還有一點,對于無主鍵的表批量更新或刪除,極易引起很長時間的主從延遲。

這里也順便提下,當主庫對于無主鍵表(特別是既無主鍵又無索引的表)大量更新或刪除時,從庫會發生極大的主從延遲,甚至會一直卡著執行不下去,別問我怎么知道的,前段時間遇到過。發生這種情況的現象是從庫延遲不斷增大,且正在執行的主庫 binlog pos 位點一直不變,這個時候需要去主庫解析下從庫卡著的 binlog pos 位點,發現是對某個無主鍵表的操作,這時若想從庫盡快趕上,可以手動設置下忽略該表的同步,處理 SQL 如下:

  1. # 假設檢查發現是 testtb 表導致了主從延遲 可以再從庫忽略該表的同步 
  2. mysql> STOP SLAVE SQL_THREAD; 
  3. Query OK, 0 rows affected (0.00 sec) 
  4.  
  5. mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (db.testtb); 
  6. Query OK, 0 rows affected (0.00 sec) 
  7.  
  8. mysql> START SLAVE SQL_THREAD; 
  9. Query OK, 0 rows affected (0.01 sec) 

忽略掉該表的同步后,從庫很快就會追上主庫了。后續可以為該表增加主鍵,然后再手動同步下并解除忽略即可。

2.找到無主鍵的表

言歸正傳,當我們的數據庫實例中有好多好多張表時,又應該如何查找是否有無主鍵的表呢?總不能一個個找吧,聰明的你可能想到了,可以從 MySQL 自帶的系統表中查找,因為我們的所有建表信息都存儲在系統庫 information_schema 中。下面 SQL 可以查找出無主鍵的表:

  1. # 查找某個庫中無主鍵的表(有唯一鍵無主鍵的表也會被查出) 
  2. SELECT 
  3.  t1.table_schema, 
  4.  t1.table_name 
  5. FROM 
  6.  information_schema.TABLES t1 
  7. LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA 
  8. AND t1.table_name = t2.TABLE_NAME 
  9. AND t2.CONSTRAINT_NAME IN ('PRIMARY'
  10. WHERE 
  11.  t2.table_name IS NULL 
  12. AND t1.table_type = 'BASE TABLE' 
  13. AND t1.TABLE_SCHEMA = 'testdb'
  14.  
  15. # 查找整個實例中無主鍵的表 
  16. SELECT 
  17.  t1.table_schema, 
  18.  t1.table_name 
  19. FROM 
  20.  information_schema.TABLES t1 
  21. LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA 
  22. AND t1.table_name = t2.TABLE_NAME 
  23. AND t2.CONSTRAINT_NAME IN ('PRIMARY'
  24. WHERE 
  25.  t2.table_name IS NULL 
  26. AND t1.table_type = 'BASE TABLE' 
  27. AND t1.TABLE_SCHEMA NOT IN ( 
  28.  'information_schema'
  29.  'performance_schema'
  30.  'mysql'
  31.  'sys' 
  32. ); 

找到了無主鍵的表,下一步就是為表新增主鍵了,無論你使用自增 id ,uuid ,或其他算法生成的主鍵字段,都建議為表新增主鍵。以自增 id 為例,我們可以為無主鍵的表這樣新增主鍵:

  1. # 為表 tb1 新增自增ID字段作為主鍵 
  2. ALTER TABLE tb1 ADD COLUMN inc_id INT UNSIGNED NOT NULL auto_increment COMMENT '自增主鍵' PRIMARY KEY FIRST
  3.  
  4. # 查找到的無主鍵表 拼接出新增主鍵的SQL 
  5. SELECT 
  6. CONCAT('ALTER TABLE ',t1.table_schema,'.',t1.table_name,' ADD COLUMN inc_id INT UNSIGNED NOT NULL auto_increment COMMENT \'自增主鍵\' PRIMARY KEY FIRST;'
  7. FROM 
  8.  information_schema.TABLES t1 
  9. LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA 
  10. AND t1.table_name = t2.TABLE_NAME 
  11. AND t2.CONSTRAINT_NAME IN ('PRIMARY'
  12. WHERE 
  13.  t2.table_name IS NULL 
  14. AND t1.table_type = 'BASE TABLE' 
  15. AND t1.TABLE_SCHEMA NOT IN ( 
  16.  'information_schema'
  17.  'performance_schema'
  18.  'mysql'
  19.  'sys' 
  20. ) ; 

總結:

本篇文章主要介紹了無主鍵表可能會產生的危害及如何查找是否存在無主鍵的表。文中的一些 SQL 都是根據系統表來查找的,各位可以保存下到自己的環境試試看哦。MySQL 中的表還是強制要求有主鍵才好,人要有主見,表也要有主鍵!

 

責任編輯:武曉燕 來源: MySQL技術
相關推薦

2022-10-08 00:00:05

SQL機制結構

2017-01-22 15:09:08

架構閉環演進

2023-04-26 07:30:00

promptUI非結構化

2022-03-31 18:59:43

數據庫InnoDBMySQL

2023-08-10 08:28:46

網絡編程通信

2021-08-27 07:06:09

DubboDocker技術

2021-01-12 05:08:49

DHCP協議模型

2022-10-18 07:33:57

Maven構建工具

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2024-02-20 21:34:16

循環GolangGo

2021-07-28 07:53:20

Github ActiDotnet 應用

2022-01-17 06:59:40

Grep指令linux

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務器

2022-03-08 17:52:58

TCP格式IP

2021-11-26 09:44:42

鏈表節點定位

2023-08-02 08:35:54

文件操作數據源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区欧美在线 | 天天射天天干 | 欧美不卡 | 欧美亚洲一级 | 在线观看欧美一区 | 99久久久久国产精品免费 | 国产第一页在线播放 | 日韩成人在线观看 | 精久久久 | 福利视频网 | 久久亚洲一区二区三区四区 | 精品熟人一区二区三区四区 | 一a级片| 欧美中国少妇xxx性高请视频 | 日本不卡一区二区三区在线观看 | 久久精品亚洲 | 国产精品一区二区无线 | 我我色综合 | 日本午夜精品一区二区三区 | 日韩网站在线 | 成人 在线 | 国产成人精品视频在线观看 | 秋霞a级毛片在线看 | 射欧美 | 成人免费视频一区二区 | 伊人久久伊人 | 久久久视 | 涩涩视频网 | 日本污视频 | 麻豆精品国产免费 | www在线视频 | 一区二区在线免费观看视频 | 国产日韩欧美在线 | 国产午夜精品久久久久免费视高清 | 人人艹人人爽 | 亚洲精品电影 | 日韩精品视频在线观看一区二区三区 | 蜜臀久久| www.日韩 | 日日夜夜精品视频 | 欧美日韩视频在线 |