gorm 強制使用索引 必看的資料庫使用規範

2021-10-13 16:31:02 字數 4295 閱讀 6940

關於mysql資料庫規範,相信大家多少看過一些文件。本篇文章給大家詳細分類總結了資料庫相關規範,從庫表命名設計規範講起,到索引設計規範,後面又給出sql編寫方面的建議。相信這些規範適用於大多數公司,也希望大家都能按照規範來使用我們的資料庫,這樣我們的資料庫才能發揮出更高的效能。

關於庫:

【強制】庫的名稱必須控制在32個字元以內,英文一律小寫。

【強制】庫的名稱格式:業務系統名稱_子系統名。

【強制】庫名只能使用英文本母,數字,下劃線,並以英文本母開頭。

【強制】建立資料庫時必須顯式指定字符集,並且字符集只能是utf8或者utf8mb4。建立資料庫sql舉例:create database db1 default character set utf8;

【建議】臨時庫、表名以tmp_為字首,並以日期為字尾,備份庫、表以bak_為字首,並以日期為字尾。

關於表【強制】表和列的名稱必須控制在32個字元以內,表名只能使用字母、數字和下劃線,一律小寫。

【強制】表名要求模組名強相關,同一模組使用的表名盡量使用統一字首。

【強制】建立表時必須顯式指定字符集為utf8或utf8mb4。

【強制】列名盡量不用關鍵字(如type,order等)。

【強制】建立表時必須顯式指定表儲存引擎型別,如無特殊需求,一律為innodb。

【強制】建表必須有comment。

【強制】對於超過100w行的大表進行alter table,必須經過dba審核,並在業務低峰期執行,多個alter需整合在一起。

因為alter table會產生表鎖,期間阻塞對於該錶的所有寫入,對於業務可能會產生極大影響。

【建議】建表時關於主鍵:表必須有主鍵

(1)強制要求主鍵為id,型別為int或bigint,且為auto_increment 建議使用unsigned無符號型。 

(2)標識表裡每一行主體的字段不要設為主鍵,建議設為其他欄位如user_id,order_id等,並建立unique key索引。

因為如果設為主鍵且主鍵值為隨機插入,則會導致innodb內部page**和大量隨機i/o,效能下降。

【建議】核心表(如使用者表)必須有行資料的建立時間欄位create_time和最後更新時間欄位update_time,便於查問題。

【建議】表中所有字段盡量都是not null屬性,業務可以根據需要定義default值。

因為使用null值會存在每一行都會占用額外儲存空間、資料遷移容易出錯、聚合函式計算結果偏差等問題。

【建議】中間表用於保留中間結果集,名稱必須以tmp_開頭。備份表用於備份或抓取源表快照,名稱必須以bak_開頭。中間表和備份表定期清理。

【示範】乙個較為規範的建表語句:

create table user_info (  `id` int unsigned not null auto_increment comment '自增主鍵',  `user_id` bigint(11) not null comment '使用者id',  `username` varchar(45) not null comment '真實姓名',  `email` varchar(30) not null comment '使用者郵箱',  `nickname` varchar(45) not null comment '暱稱',  `birthday` date not null comment '生日',  `***` tinyint(4) default '0' comment '性別',  `short_introduce` varchar(150) default null comment '一句話介紹自己,最多50個漢字',  `user_resume` varchar(300) not null comment '使用者提交的簡歷存放位址',  `user_register_ip` int not null comment '使用者註冊時的源ip',  `create_time` timestamp not null default current_timestamp comment '建立時間',  `update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改時間',  `user_review_status` tinyint not null comment '使用者資料審核狀態,1為通過,2為審核中,3為未通過,4為還未提交審核',  primary key (`id`),  unique key `uniq_user_id` (`user_id`),  key `idx_username`(`username`),  key `idx_create_time_status`(`create_time`,`user_review_status`)) engine=innodb default charset=utf8 comment='**使用者基本資訊'
關於索引

【強制】innodb表必須主鍵為id int/bigint auto_increment,且主鍵值禁止被更新。

【強制】innodb和myisam儲存引擎表,索引型別必須為btree。

【建議】主鍵的名稱以pk_開頭,唯一鍵以uniq_uk_開頭,普通索引以idx_開頭,一律使用小寫格式,以字段的名稱或縮寫作為字尾。

【建議】單個表上的索引個數不能超過8個。

【建議】在建立索引時,多考慮建立聯合索引,並把區分度最高的字段放在最前面。如列userid的區分度可由select count(distinct userid)計算出來。

【建議】在多表join的sql裡,保證被驅動表的連線列上有索引,這樣join執行效率最高。

【建議】建表或加索引時,保證表裡互相不存在冗餘索引。

對於mysql來說,如果表裡已經存在key(a,b),則key(a)為冗餘索引,需要刪除。

sql編寫

【強制】程式端select語句必須指定具體欄位名稱,禁止寫成 *。

【強制】程式端insert語句指定具體欄位名稱,不要寫成insert into t1 values(…)。

【強制】除靜態表或小表(100行以內),dml語句必須有where條件,且使用索引查詢。

【強制】where條件裡等號左右字段型別必須一致,否則無法利用索引。

【強制】where 子句中禁止只使用全模糊的like條件進行查詢,必須有其他等值或範圍查詢條件,否則無法利用索引。

【強制】索引列不要使用函式或表示式,否則無法利用索引。如where length(name)='admin'或where user_id+2=10023。

【建議】insert into…values(xx),(xx),(xx).. 這裡xx的值不要超過5000個。

值過多雖然上線很很快,但會引起主從同步延遲。

【建議】select語句不要使用union,推薦使用union all,並且union子句個數限制在5個以內。

因為union all不需要去重,節省資料庫資源,提高效能。

【強制】禁止跨db的join語句。

【建議】不建議使用子查詢,建議將子查詢sql拆開結合程式多次查詢,或使用join來代替子查詢。

【建議】線上環境,多表join不要超過5個表。

【建議】在多表join中,盡量選取結果集較小的表作為驅動表,來join其他表。

【建議】批量運算元據時,需要控制事務處理間隔時間,進行必要的sleep。

建議】事務裡包含sql不超過5個

因為過長的事務會導致鎖資料較久,mysql內部快取、連線消耗過多等問題。

【建議】事務裡更新語句盡量基於主鍵或unique key,如update … where id=xx;

否則會產生間隙鎖,內部擴大鎖定範圍,導致系統效能下降,產生死鎖。

【建議】減少使用order by,和業務溝通能不排序就不排序,或將排序放到程式端去做。order by、group by、distinct這些語句較為耗費cpu,資料庫的cpu資源是極其寶貴的。

【建議】order by、group by、distinct這些sql盡量利用索引直接檢索出排序好的資料。如where a=1 order by b可以利用key(a,b)。

【建議】包含了order by、group by、distinct這些查詢的語句,where條件過濾出來的結果集請保持在1000行以內,否則sql會很慢。

— end —

如果你喜歡我的文章

請在文末右下角點一下在看❤

oracle強制索引使用

強制索引格式 select tablename.from tablename table alias where fieldname 說明 index table alias indexname 必須出現在select 之後,字段之前 tablename 為表名,如果sql中表有別名,則必須使用表的...

mysql強制使用索引與不使用索引

oracle可以強制使用索引來優化那些因為種種原因沒走索引的sql mysql支援嗎?答案是肯定的 mysql強制索引和禁止某個索引 1.mysql強制使用索引 force index 索引名或者主鍵pri 例如 select from table force index pri limit 2 強...

MYSQL強制使用索引和禁止使用索引

1 mysql強制使用索引 force index 索引名或者主鍵pri 例如 select from table force index pri limit 2 強制使用主鍵 select from table force index ziduan1 index limit 2 強制使用索引 zi...