SQL查詢優化 資料結構設計

2021-06-26 03:43:53 字數 1965 閱讀 3468

本文部分內容會涉及mysql,可能在其他資料庫中並不適用。本章節只針對資料庫結構設計做討論,查詢優化的其他內容待續。

資料庫設計及使用是web開發程式設計師必備的一項基礎技能,在大資料量和高併發場景,合理的資料結構及sql查詢優化對專案來說都會顯得格外重要。大部分有經驗的程式設計師都能了解到,程式的瓶頸往往不在程式本身,而在資料訪問層。造成資料訪問效率低下的原因有很多,如何解決這些問題,直接影響到應用的穩定性、健壯性。以下列舉幾個常見的問題:

以上只是列出了資料庫使用過程中比較常見的問題,出現這些問題的常見原因列舉如下:

本節只對資料結構設計不合理進行討論,後續章節會繼續討論其他內容。

一直覺得作為乙個中級以上水平的程式設計師,查詢優化是一項必備的基礎技能。良好的資料結構設計,直接影響到後期軟體的效能、健壯性、可維護性、可擴充套件性。見過很多因為資料結構設計不合理而造成軟體最終難以擴充套件,難以維護的場景。要避免這些問題,我們就要掌握良好的資料結構設計能力。

怎樣的資料結構才是合理的?這並沒有乙個完美通用的解決方案,要考慮具體的應用場景。但有一些準則,使我們應該嘗試去遵守的。列舉如下:

根據業務查詢場景,考慮資料結構分布

如果沒有業務主鍵,應建立id自增主鍵

保證使用較小的資料型別,避免空間浪費

合理控制表的字段數量,必要時分表儲存

新增字段注釋

針對以上幾點,分別詳述如下:

業務場景,決定了你要儲存什麼樣的資料,但它不會決定你要如何儲存這些資料。你可以簡單的將這些資訊儲存到一張表裡,例如user表。但當我們需要更多的資訊,例如使用者的附屬屬性(學校,住址等),如果全部塞到一張表裡,對於小資料量的資料庫不會有太大問題,但當遇到大資料量的場景時,查詢就有可能變的緩慢。分表會是乙個更好的解決方案,根據不同的業務場景,將這些資訊分為兩類,儲存在不同的表裡,是更加合理的解決方案。

這裡要說的其實是,不要為了方便把所有的東西都塞到一張表裡,雖然這樣會讓你的程式編寫起來容易很多,但是會造成更多的問題。例如有些人會把1:n的關係儲存到一張表裡,這樣就會帶來資料冗餘,壞處有很多,例如:針對n的寫改刪查都會變得很複雜;表體積變大、字段增多,造成查詢緩慢;其他錶鏈表查詢時速度緩慢等等。

主鍵是一條記錄的唯一標誌,沒有主鍵在很多時候我們無法得心應手的運算元據。可能在某些場景下,我們確實沒有設定主鍵的必要,但無論你是否主動設定主鍵,資料庫都會有乙個主鍵(如果你沒有主動設定,資料庫缺省會有乙個row_id列,而這一列是你看不到的)。主鍵在連表、查詢等方面業務提供很大幫助,所以無論如何,建立乙個主鍵是很必要的

較小的資料型別意味著較小的儲存代價,且資料庫能夠更高效的利用快取空間。儲存引擎都會採用不同的方式對索引或者資料快取在內容中,較小的資料型別意味著在有限的內容空間中,你能夠儲存更多有價值的資料。對於可變長度的varchar型別,如果我們設定的是20長度,但實際占用的只有10個長度,在載入記憶體時,占用的空間依舊是20而不是10。所以對於可變長度型別,合理的長度更為重要。

字段數量過多如果不是因為業務需且資料結構設計合理,大多會產生以下幾個問題:

這裡要提醒避免不必要的資料冗餘,針對資料冗餘的討論我們暫且放在後面。

因為字段資料量多,往往查詢場景也會非常複雜多變,所以索引也就跟著變多了。索引多會直接影響到表的寫入效能,這個效能的損耗是非常大的,可能是數以十倍計算的時間損耗。在寫入頻繁的場景,有可能會出現寫入瓶頸。由於寫入而影響讀取效能的問題也很多。

表體積大意味著資料庫在讀取資料的時候需要掃瞄更多更大的資料塊,載入記憶體做快取時也不能充分利用快取帶來的效果。表大小對於表的效能也是由為重要的。

分表是解決欄位過多的乙個解決方案,資料庫分表後,程式可能會改動比較大,但我們應該追求合理完美的軟體設計,摒棄糟粕。分表後使用鍊錶查詢,或者在程式中做兩次查詢。有些人可能會覺得連表,效能一定很差,其實不然。連表意味著我們在同乙個sql中,可以使用兩個索引,但是單錶查詢我們只能使用乙個索引。如果索引設計合理,在大多數場景下(應該是大資料量場景),連表查詢會比單錶查詢效能更高,甚至高出太多。曾經有過這樣的場景,優化分表後畫面變得沒好多了。

這裡只是為了提示規範化資料庫設計。

sql查詢優化——資料結構設計

資料結構設計

mfc提供的集合類來管理文件資料,mfc提供幾種處理物件陣列的類,如集合類,這些集合類表現為下列兩種風格 1.模板為基的集合類 2.非模板為基的集合類 每個集合類又進一步按他的元素型別和他的形加以區分。集合的形指明在集合每如何組織資料,mfc提供3種通用集合類的形 array 陣列,有次序性,可以動...

單據資料結構設計

單據資料結構設計 單據形式 企業中的表單 請假單 加班單等等 大多數完成兩個功能 一 審批 二 產生業務記錄。一般情況下,會根據表單上欄位所處的位置,將其設計為單據頭 單據體那樣一對多的關係。通乙個業務可能表單的形式不盡相同,以加班單為例 有一人多天加班 有多人一天加班,有多人多天的加班。不論怎麼變...

資料結構 設計迴圈佇列

要求 設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於 fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為 環形緩衝器 迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間...