選擇適合數(shù)據(jù)類型和長度
當我們把一個表的ID列定義為INT數(shù)據(jù)類型時,那么就要思考一個問題,這個表的數(shù)據(jù)量是否會隨著業(yè)務(wù)的發(fā)展而快速增長。
當這個表只是一個簡單的配置表或基礎(chǔ)數(shù)據(jù)表時,設(shè)置為INT類型或許沒有問題。當一個表存儲的是歷史記錄或日志記錄時,數(shù)據(jù)量必然會隨著業(yè)務(wù)的發(fā)展而快速增長,該列的空間會很快被耗盡,導(dǎo)致系統(tǒng)部分功能不可用。
針對此種情況,可提前預(yù)測業(yè)務(wù)發(fā)展,將ID字段設(shè)置為BIGINT類型。
這一條規(guī)則不僅適用于數(shù)值類型,還適用于字符串類型。例如,如果試圖在一個VARCHAR(255) 的列中寫入一個包含300個字符的字符串,而MySQL正處于嚴格模式(Strict Mode,默認為開啟狀態(tài)),那么MySQL會返回錯誤并拒絕寫入。如果MySQL沒有開啟嚴格模式,超過長度的數(shù)據(jù)會被截斷,從而導(dǎo)致可能重要的數(shù)據(jù)丟失。
與數(shù)據(jù)不足問題相反,列數(shù)據(jù)的存儲空間過多也可能是問題所在。雖然不會像存儲空間不足的情況那樣嚴重,但過度預(yù)留空間會帶來存儲和性能方面的影響。
比如,假設(shè)我們需要存儲一個五位的編碼,這種情況可以使用 INT 數(shù)據(jù)類型(存儲 32 位整數(shù))來存儲,但這樣分配的存儲遠遠超過實際需求。此時,使用 SMALLINT 會是更好的選擇,因為它存儲的是 16 位整數(shù),足夠存儲這個五位的編碼。
存儲分配過多會引起的兩方面問題:
所以,在選擇數(shù)據(jù)類型時我們需要考慮:不僅要滿足當前數(shù)據(jù)量的需求,還要能支持未來潛在的增長。
缺失索引或冗余索引
索引在 MySQL 中通過構(gòu)建一個經(jīng)過優(yōu)化的結(jié)構(gòu)來加速數(shù)據(jù)訪問,使查詢更快地返回符合條件的數(shù)據(jù)。如果沒有利用索引,當執(zhí)行未分頁或未定義LIMIT的查詢時,MySQL 會對表執(zhí)行掃描操作。這意味著它會從表的第一行開始逐行讀取,直到找到匹配條件的所有行。如果某個被頻繁訪問的大表沒有使用索引,從表掃描會帶來巨大的性能損失。
關(guān)于索引部分的內(nèi)容,可以參考前面的文章,特別是《學(xué)習(xí)MySQL繞不開的兩個基礎(chǔ)概念:聚集索引與非聚集索引》一文。
但與此同時,如果索引過多也會帶來另一方面的問題。
創(chuàng)建的每個索引都會占用額外的存儲空間,因此冗余或未使用的索引會直接增加存儲成本。此外,當表中的數(shù)據(jù)被更新或插入時,MySQL 會更新這些索引及其相關(guān)統(tǒng)計信息,以確保索引的準確性。這可能是一項耗時的操作,可能導(dǎo)致不良的用戶體驗。
關(guān)于索引增加存儲成本部分,可參考閱讀《MySQL之進階:一篇文章搞懂MySQL索引之B+樹》一文。
選擇合適的存儲結(jié)構(gòu)
過去十多年,越來越多的公司選擇使用NoSQL來存儲半結(jié)構(gòu)化數(shù)據(jù),以滿足快速處理大量數(shù)據(jù)的需求。這類數(shù)據(jù)存儲已經(jīng)有很多專業(yè)解決方案,但實際上 MySQL 在這方面也很有能力。當隔壁字段需要采用半結(jié)構(gòu)化數(shù)據(jù)存儲,又沒必要引入NoSQL時,可考慮采用MySQL提供的能力來存儲。
大多數(shù)存儲在數(shù)據(jù)庫中的半結(jié)構(gòu)化數(shù)據(jù)通常是以JSON的形式表示。最簡單的方式是將JSON字符串存儲在TEXT類型的列中,但這并不是最佳選擇。
MySQL支持一種專門用于存儲JSON的列類型:JSON。這種類型會將JSON數(shù)據(jù)以高效的二進制格式存儲。
使用JSON而非TEXT類型有兩個關(guān)鍵好處:
關(guān)于MySQL的JSON類型創(chuàng)建索引可參考閱讀《如何為MySQL中的JSON字段設(shè)置索引》一文。
小結(jié)
有一定開發(fā)經(jīng)驗的朋友都知道,數(shù)據(jù)庫是系統(tǒng)最容易形成性能瓶頸問題的點,因此,針對數(shù)據(jù)庫的設(shè)計和深思熟慮絕對是值得在前期投入的事。
否則,一旦有大量線上數(shù)據(jù),再進行修改將是一件非常復(fù)雜和有風(fēng)險的事。希望這篇文章能夠為大家提供幫助,同時也能啟發(fā)大家去思考更多的數(shù)據(jù)庫設(shè)計優(yōu)化。
參考文章:原文鏈接?