1. 程式人生 > 其它 >人要有主見,表也要有主鍵

人要有主見,表也要有主鍵

背景

在MySQL中,建表時一定要指定主鍵,並且是not null和auto increment單調遞增的.那麼為什麼MySQL中建表一定要指定主鍵呢?因為在MySQL中資料的儲存是根據索引進行儲存的.也叫索引組織表.所以mysql要求建表時要有主鍵.那麼如果我們在建表時沒有指定主鍵索引怎麼辦呢?mysql會選擇第一個unique key且定義為not null的索引作為主鍵索引,那麼如果這個索引也沒有怎麼辦呢?mysql會預設生成一個隱藏列佔6個位元組作為這個表的主鍵索引.索引在此也可以看到.MySQL是強制一個表必須要有主鍵的

沒有主鍵的危害

那麼在mysql中如果一個表沒有主鍵會有什麼影響呢?首先你基於某個你認為是主鍵列的查詢,插入,更新,都會變慢.同時還會引起主從延遲的加大.再其次你的架構可擴充套件性將變小.因為無論是PXC還是MGR這些高可用架構都需要你顯示的制定主鍵,mycat,dble或者shardingspher這些分散式架構也都需要你顯示的指定主鍵.所以為了我們運維的安全性及架構的可擴充套件性.都一定要顯示的制定主鍵.同時一定要告訴你的開發.主鍵一定要使用int或者bigint資料型別.不要使用uuid或者varchar這些資料型別.這些資料型別會導致索引失效和表碎片的產生.

檢視沒有主鍵的表


FROM information_schema.tables t1

WHERE (table_schema, table_name) NOT IN (

SELECT DISTINCT table_schema, table_name

FROM information_schema.columns

WHERE COLUMN_KEY = 'PRI'

)

AND table_schema NOT IN ('sys', 'mysql', 'information_schema', 'performance_schema')
and t1.table_rows is not null;

批量加主鍵索引

CONCAT('ALTER TABLE ',t1.table_schema,'.',t1.table_name,' ADD COLUMN inc_id bigINT UNSIGNED NOT NULL auto_increment COMMENT \'自增主鍵\' PRIMARY KEY FIRST;')
FROM
information_schema.tables t1
WHERE (table_schema, table_name) NOT IN (
SELECT DISTINCT table_schema, table_name
FROM information_schema.columns
WHERE COLUMN_KEY = 'PRI'
)
AND table_schema NOT IN ('sys', 'mysql', 'information_schema', 'performance_schema')
and t1.table_rows is not null;

注意: 在mysq8.0中新增主鍵索引的話使用的是inplace方式進行新增的.會有短暫鎖表.如果是在生產上進行批量新增索引的話.請在業務不繁忙的時候新增!!!