Mysql 建表及查詢規範

2021-08-20 00:20:33 字數 2187 閱讀 2802

int:如無特殊需要,存放整型數字使用unsigned int型。整型欄位後的數字代表顯示長度。整型型別如下表:

資料型別

最大儲存長度(有符號)

最大儲存長度(無符號)

tinyint(m)

1個位元組 範圍(-128~127)

1個位元組 範圍(0~256)

smallint(m)

2個位元組 範圍(-32768~32767)

2個位元組 範圍(0~65535)

mediumint(m)

3個位元組 範圍(-8388608~8388607)

3個位元組 範圍(0~16777215)

int(m)

4個位元組 範圍(-2147483648~2147483647)

4個位元組 範圍(0~4294967294)

bigint(m)

8個位元組 範圍(+-9.22*10的18次方)

8個位元組 範圍(0~1.84*10的20次方)

decimal(m,d):定點小數使用此decimal型別,且明確標識出為無符號型(unsigned),除非確實會出現負數。 

date:所有只需要精確到天的字段全部使用date型別,而不應該使用timestamp或者datetime型別。

datetime:所有需要精確到時間(時分秒)的字段均使用datetime,不要使用timestamp型別。

varchar:所有動態長度字串 全部使用varchar型別。如無特殊需要,原則上單個varchar型字段不允許超過255個字元。

char:僅僅只有單個字元的字段使用char(1)型別,例如性別字段。如無特殊需要,建議innodb引擎不使用char型 。

text:僅僅當字元數量較多時,才允許使用text。如無特殊需要,嚴禁開發人員使用mediumtext、longtext型別。

對於精確浮點型資料儲存,需要使用decimal,嚴禁使用float和double。 

如無特殊需要,嚴禁開發人員使用blob型別。 

如無特殊需要,字段必須使用not null屬性,可用預設值代替null。mysql null型別和oracle的null有差異,會進入索引中。此外,null在索引中的處理也是特殊的,也會占用額外的存放空間。

不建議使用enum、set型別,使用tinyint來代替。 

每個列定義的時候必須加上comments。

自增字段型別必須是整型且必須為unsigned,推薦型別為int或bigint,並且自增字段必須是主鍵或者主鍵的一部分。

日期型別的字段不能使用varchar或者char型別,只能使用date、datetime欄位型別存放。

sql語句盡可能簡單,大的sql想辦法拆成小的sql語句(充分利用query cache和充分利用多核cpu)。

事務要簡單,整個事務的時間長度不要太長。

避免使用觸發器、函式。

禁止使用儲存過程。

降低業務耦合度,為sacle out、sharding留有餘地。

避免在資料庫中進行數**算(mysql不擅長數**算和邏輯判斷)。

不要用select *,查詢哪幾個欄位就select 這幾個字段。

sql中使用到or的改寫為用 in()   (or的效率沒有in的效率高),in裡面數字的個數建議控制在1000以內。

limit分頁注意效率。limit越大,效率越低。可以改寫limit,比如例子改寫:select id from tlimit 10000, 10;  =>  select id from t where id > 10000 limit10。

避免使用大表的join,使用group by 分組、自動排序。

對資料的更新要打散後批量更新,不要一次更新太多資料,減少與資料庫的互動次數。

sql語句不可以出現隱式轉換,比如 select id from 表 where id='1'。

能不用not in就不用not in,坑太多了。。會把空和null給查出來。

在sql語句中,禁止使用字首是%的like。

不使用負向查詢,如not in/like。

關於分頁查詢:程式裡建議合理使用分頁來提高效率limit,offset較大要配合子查詢使用。

禁止在資料庫中跑大查詢。

使用預編譯語句,只傳引數,比傳遞sql語句更高效;一次解析,多次使用;降低sql注入概率。

禁止使用order by rand()。

禁止單條sql語句同時更新多個表。

備註:公司前輩經驗之談,受益匪淺!

mysql建表規範

create table dbname bodyguard black box id int 11 not null auto increment,login id varchar 64 default null comment 使用者登入賬號,手機號 bize code varchar 64 de...

MySQL學習之建表規範

資料型別盡量用數字型別,數字型別的比字元型別的要快很多,比如使用int unsigned儲存ip 大資料字段最好剝離出單獨的表,以便影響效能 使用varchar,代替char,這是因為varchar會動態分配長度資料型別盡量小,這裡的盡量小是指在滿足可以預見的未來需求的前提下的,但是有不能太小,所以...

Mysql建表和索引使用規範

mysql建表和索引使用規範 tt lan2003 一 mysql建表,欄位需設定為非空,需設定字段預設值。二 mysql建表,欄位需null時,需設定字段預設值,預設值不為null。三 mysql建表,如果字段等價於外來鍵,應在該字段加索引。四 mysql建表,不同表之間的相同屬性值的字段,列型別...