MySQL優(yōu)化之Schema設(shè)計
本文轉(zhuǎn)載自微信公眾號「小豬notebook」,作者鐘Ger。轉(zhuǎn)載本文請聯(lián)系小豬notebook公眾號。
參考文獻(xiàn):《高性能MySQL(第三版)》
1. 更優(yōu)化的數(shù)據(jù)類型
(1)選擇可以正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型。 因?yàn)樗鼈冋加酶俚拇疟P、內(nèi)存和CPU緩沖,且處理時需要的CPU周期也更少。
(2)簡單的數(shù)據(jù)類型。 因?yàn)楹唵螖?shù)據(jù)類型的操作通常需要更少的CPU周期。eg:整型比字符型更好;使用MySQL內(nèi)建的類型如date、datetime、time等而不是字符串來存儲日期和時間;使用整型來存儲IP地址而非字符串。
(3)盡量避免NULL。通常情況下最好指定列為NOT NULL。因?yàn)槿舨樵冎邪梢詾镹ULL的列,對于MySQL對可為NULL列使用索引、索引統(tǒng)計和值比較都更復(fù)雜。
我們建表時選擇數(shù)據(jù)類型參考上圖的流程即可。
2. MySQL數(shù)據(jù)類型大致整理
我們開發(fā)中常用的MySQL數(shù)據(jù)類型整理如下:
在建表的過程中,我們可以根據(jù)不同數(shù)據(jù)類型的優(yōu)缺點(diǎn)來進(jìn)行選取,從而使得表的存儲空間與性能達(dá)到最優(yōu)。
3. 一些簡單的設(shè)計原則
一些我們開發(fā)過程中值得借鑒的表設(shè)計原則總結(jié):
- 避免過度設(shè)計,減少產(chǎn)生復(fù)雜查詢的schema、多列表的設(shè)計
- 使用小而簡單的合適數(shù)據(jù)類型,除非真實(shí)數(shù)據(jù)模型中有明確需要,否則盡可能避免使用null值,而應(yīng)該給每個列設(shè)置一個默認(rèn)0值
- 盡可能使用相同數(shù)據(jù)類型存儲相似或相關(guān)的值,尤其是關(guān)聯(lián)條件中使用的列
- 可變長字符串中盡可能按需設(shè)置字符串的長度
- 避免使用MySQL廢棄的特性,例如指定浮點(diǎn)數(shù)的精度、整數(shù)的顯示寬度等
- 希望每位Developer都能夠好好設(shè)計表,減少被公司的DBA吐槽的機(jī)會