MySQL開發設計規範

1.庫命名規則:dbname_suffix,分爲_dev/_test/_pre/_mertest/_perf/_prod六個環境函數

2.適度反範式設計,冗餘表字段數據減小JOIN關聯提升訪問效率性能

3.普通索引命名:idx_字段名,聯合索引命名:idx_字段名1_字段名2…,惟一索引命名:uq_字段名優化

4.表和字段必須加上(中文)註釋設計

5.存儲時間類型datetime/timestamp/date等,不使用char/varchar。【建議】建議當時間範圍小於2037年使用TIMESTAMP類型,由於 TIMESTAMP佔用空間更小unix

6.關鍵業務數據表,增長create_time和update_time字段,使用current_timestamp()函數定義默認值,方便後期數據分析和問題追溯索引

示例:資源

create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',數據分析

update_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間'io

7.存儲精確浮點數必須使用 DECIMAL 替代 FLOAT 和 DOUBLEtable

8.全部字段均顯示定義爲NOT NULL,不使用 DEFAULT NULL 並指定DEFAULT值

   ×   aaa varchar(32) DEFAULT NULL

   √   aaa varchar(32) NOT NULL  DEFAULT ''

   √   bbb int   NOT NULL  DEFAULT -1

9.char ,Varchar 長度適當,可預見範圍內儘可能小

   說明:varhcar(10) 中的數字不是字節而是字符,那麼此處能存下10個漢字或字母。**

   ×   `aaa` varchar(2000) NOT NULL  DEFAULT ''

10.單表字段數量控制在50個之內,儘量不使用TEXT、BLOB 類型,將過大字段拆分到其餘表中

11.支持建立新表和添加新字段,禁止drop和rename表名和字段名(支持應用上灰度發佈)

12.UPDATE、DELETE 語句須要根據 WHERE 條件添加索引

13.對長度過長的 VARCHAR 字段創建索引時, 添加 crc32 或者 MD5 Hash 字段, 對 Hash 字段創建索引

14.禁止在更新頻繁、區分度不高的字段上創建索引

15.JOIN字段要建立索引

16.單個索引字段數不超過5,最好使用惟一性好的索引,單表索引數量不超過5

17.ORDER BY,GROUP BY,DISTINCT 的字段須要添加在索引的後面,不然會很消耗io、cpu計算資源

18.SELECT 語句只輸出須要的字段,禁止SELECT *

19.SELECT、INSERT 語句必須顯式的指明字段名稱,不使用 SELECT *,不使用 INSERT INTO table()

20.寫密集場景INSERT 語句使用 batch 提交(INSERT INTO table VALUES(),(),()……) ,values 的個數不該過多,控制在1000個之內

21.避免大表與大表之間的JOIN,考慮讓小表去驅動大表JOIN

22.關於分頁優化,兩種分頁查詢的正確姿式:

SELECT * FROM table WHERE TIME<last_TIME ORDER BY TIME DESC LIMIT 10

SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)

23.WHERE語句中使用IN代替OR ,但IN的值不超過1000,或改寫成JOIN性能會更好

24.WHERE 條件中的非等值條件(IN、BETWEEN、<、<=、>、>=)會致使後面的條件使用不了索引

25.WHERE 條件中字段禁止運算禁止使用函數`× where id + 1 = 100

    √ where id  = 100 -1

    × where unix_timestamp('time') = 1366169490

    √ where time = FROM_UNIXTIME(1366169490) `

26.WHERE中禁止使用%前綴模糊查詢,例如 LIKE 「%abc」,會致使全表掃描

相關文章
相關標籤/搜索