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