資料庫SQL開發規範

2021-08-13 11:33:21 字數 1692 閱讀 1324

1、mysql中,varchar(n)中的n代表的是字元數,而不是位元組數。例如varchar(255)表示可以儲存255的中文

2、過大的長度會消耗更多的記憶體。varchar(n),儲存時是按照資料實際長度儲存的。當把資料讀入到記憶體時,為了提高效率,是按照n的長度分配記憶體的。

3、盡可能將所有列定義為not null。

a、索引null列,需要額外的空間來儲存,所以要占用更多的空間。

b、進行比較和運算時要對null值做特別的處理,同時可能導致索引失效。

4、避免資料型別的隱式轉換。隱式轉換會導致索引失效。

例如select * from tablea where id = '123',這裡id其實是整數型別的,這就出現了隱式轉換

5、充分利用表上已經存在的索引

a、避免使用雙%號或前置%的查詢條件。如a like '%123%'或a like '%123',這些可能無法使用索引。

b、乙個sql只能利用到復合索引中的一列進行範圍查詢

例如聯合索引(a,b,c) ,如果對a的都是範圍查詢的話,那麼對於b和c的索引是用不到的。這時,應該把a類放在最右側,即(b,c,a)

c、使用left join或not exists來優化not in操作。not in通常會使索引失效

d、在mysql優化生成執行計畫時,會比較各個索引的效率,進而生成最終的執行計畫。過多的索引,會導致這個過程變慢,進而體現在sql的執行時間上

6、禁止使用不含字段列表的insert語句,例如insert into t values(a,b,c),這樣表結構變化可能會導致相容異常。應該為insert into t(c1,c2,c3) values(a,b,c)

7、避免使用子查詢,可以把子查詢優化為join操作。

a、子查詢的結果集無法使用索引

b、子查詢會產生歷史表的操作(子查詢結果一般會儲存在臨時表中,無論是記憶體臨時表或是資料庫臨時表,他們不會使用到索引),如果子查詢資料量大則嚴重影響效率

c、因為子查詢會查詢臨時表,且不使用索引,所以資料量大時,會消耗過多的cpu及io資源

8、避免使用join關聯太多的表

a、每join乙個表會多佔一部分記憶體(join_buffer_size)

b、會產生臨時表操作,影響查詢效率

c、mysql最多允許關聯61個表,建議不超過5個

9、減少同資料庫的互動次數

a、資料庫更適合處理批量操作

b、合併多個相同的操作到一起,可以提高處理效率

10、對於同一列,使用in代替or,in內的資料最好不超過500個。個人經過explain執行計畫,似乎沒有發現這條規律。

11、where從句中禁止對列進行函式抓換和計算,否則會導致無法使用索引。

例如where date(createtime) = '20160901',無法使用索引。

12、在明顯不會有重複值時使用union all而不是union。

a、union會把所有資料放在臨時表中後再進行去重操作

b、union all不會再對結果集進行去重操作

資料庫sql編寫規範

一 dml語句 select語句必須指定具體欄位名稱,禁止寫成 因為select 會將不該讀的資料也從mysql裡讀出來,造成磁碟和網絡卡壓力,尤其在有text或者blob欄位的時候。select語句不要使用union,推薦使用union all,並且union子句個數限制在5個以內。因為union...

資料庫開發規範參考

一.命名規範1.使用 innodb 儲存引擎 2.使據庫和表的字符集統一使用 utf8 字符集 3.所有的表和字段都要新增注釋 4.盡量控制單錶資料量控制在 500 萬行以內 5.謹慎使用 mysql 分割槽表 6.做到冷熱資料分離,減少表的寬度 7.禁止在表中建立預留字段 8.禁止在資料庫中儲存,...

MYSQL資料庫開發規範

自己總結的mysql開發規範,夠用就行了。1 表 1.1 表必須要有主鍵,主鍵使用自動遞增,型別為int。1.2 表名使用有意義的英文單詞,可用下劃線分割。如需使用縮寫時,不可使用意義不明的縮寫。1.3 需要多表join的字段,資料型別保持絕對一致。1.4 字段命名時需要加上表名,確保所有表中的字段...