- 存儲(chǔ)引擎必須使用InnoDB
InnoDB 支持事物,行級(jí)鎖,并發(fā)性能更好,CPU以及內(nèi)存優(yōu)化更高 - 必須設(shè)置主鍵ID,并且使用主鍵自增,除非是在分庫(kù)分表的環(huán)境下
由于InnoDB的組織數(shù)據(jù)的方式?jīng)Q定了需要有一個(gè)主鍵,而且若是這個(gè)主鍵ID是單調(diào)遞增的可以有效提高插入的性能,避免過(guò)多的頁(yè)分裂,減少表碎片提高空間的使用率。 - 使用utf8m64字符集
mysql中UTF-8并非是“真正的UTF-8”,而“utf8m64”才是真正的“UTF-8”。 - 庫(kù)名,表名字段名均小寫,下劃線風(fēng)格,不超過(guò)32個(gè)字符。
- 單表列數(shù)必須小于30,若超過(guò)則應(yīng)該考慮將表拆分
單表列表太多是的Mysql服務(wù)器處理InnoDB返回?cái)?shù)據(jù)之間的映射成本太高。 - 禁止使用外鍵,如果有外鍵約束,需要應(yīng)用程序控制
外鍵會(huì)導(dǎo)致表與表之間耦合,UPDATE與DELETE操作都會(huì)涉及相關(guān)聯(lián)的表,十分影響SQL的性能,甚至?xí)斐伤梨i - 必須把字段定義為NOT NULL并且提供默認(rèn)值
- NULL的列使的索引/索引統(tǒng)計(jì)/值比較更加復(fù)雜,對(duì)MySQL來(lái)說(shuō)更難優(yōu)化
- NULL這種類型MySQL內(nèi)部需要特殊處理,增加數(shù)據(jù)庫(kù)處理記錄的復(fù)雜性;同等條件下,表中有較多空字段的時(shí)候,數(shù)據(jù)庫(kù)的處理性能會(huì)降低很多
- NULL值需要更多存儲(chǔ)空間,無(wú)論是表還是索引每行中的NULL列需要額外的空間來(lái)標(biāo)識(shí)
- 在一些場(chǎng)景下,考慮使用TIMESTAMP代替DATETIME
- TIMESTAMP只需要占用4個(gè)字節(jié)長(zhǎng)度,可以存儲(chǔ)范圍為(1970-2038)年,
- 而DATETIME類型占用8個(gè)字節(jié),對(duì)時(shí)區(qū)不敏感,可以存儲(chǔ)的范圍為(1001-9999)年