SQL查詢優化——數據結構設計

本文部份內容會涉及mysql,可能在其餘數據庫中並不適用。本章節只針對數據庫結構設計作討論,查詢優化的其餘內容待續。mysql

數據庫設計及使用是WEB開發程序員必備的一項基礎技能,在大數據量和高併發場景,合理的數據結構及SQL查詢優化對項目來講都會顯得格外重要。大部分有經驗的程序員都能瞭解到,程序的瓶頸每每不在程序自己,而在數據訪問層。形成數據訪問效率低下的緣由有不少,如何解決這些問題,直接影響到應用的穩定性、健壯性。如下列舉幾個常見的問題:程序員

  • 數據庫鎖表,查詢阻塞
  • 高併發場景下,連接數量瓶頸
  • 查詢效率低下,程序長時間沒法退出
  • 寫入性能低下,形成讀寫競爭激烈

以上只是列出了數據庫使用過程當中比較常見的問題,出現這些問題的常見緣由列舉以下:sql

  • 數據結構設計不合理
  • 索引設計糟糕
  • 程序維護數據連接不合理
  • 程序員太懶惰,數據庫作了不擅長的工做
  • 數據冗餘
  • SQL太渣

本節只對數據結構設計不合理進行討論,後續章節會繼續討論其餘內容。數據庫

一直以爲做爲一箇中級以上水平的程序員,查詢優化是一項必備的基礎技能。良好的數據結構設計,直接影響到後期軟件的性能、健壯性、可維護性、可擴展性。見過不少由於數據結構設計不合理而形成軟件最終難以擴展,難以維護的場景。要避免這些問題,咱們就要掌握良好的數據結構設計能力。緩存

怎樣的數據結構纔是合理的?這並無一個完美通用的解決方案,要考慮具體的應用場景。但有一些準則,使咱們應該嘗試去遵照的。列舉以下:數據結構

  1. 根據業務查詢場景,考慮數據結構分佈
  2. 若是沒有業務主鍵,應創建ID自增主鍵
  3. 保證使用較小的數據類型,避免空間浪費
  4. 合理控制表的字段數量,必要時分表存儲
  5. 添加字段註釋

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

一、根據業務場景,考慮數據結構分佈

業務場景,決定了你要存儲什麼樣的數據,但它不會決定你要如何存儲這些數據。你能夠簡單的將這些信息存儲到一張表裏,例如user表。但當咱們須要更多的信息,例如用戶的附屬屬性(學校,住址等),若是所有塞到一張表裏,對於小數據量的數據庫不會有太大問題,但當遇到大數據量的場景時,查詢就有可能變的緩慢。分表會是一個更好的解決方案,根據不一樣的業務場景,將這些信息分爲兩類,存儲在不一樣的表裏,是更加合理的解決方案。數據庫設計

這裏要說的實際上是,不要爲了方便把全部的東西都塞到一張表裏,雖然這樣會讓你的程序編寫起來容易不少,可是會形成更多的問題。例若有些人會把1:N的關係存儲到一張表裏,這樣就會帶來數據冗餘,壞處有不少,例如:針對N的寫改刪查都會變得很複雜;表體積變大、字段增多,形成查詢緩慢;其餘錶鏈表查詢時速度緩慢等等。高併發

二、若是沒有業務主鍵,應創建ID自增主鍵

主鍵是一條記錄的惟一標誌,沒有主鍵在不少時候咱們沒法駕輕就熟的操做數據。可能在某些場景下,咱們確實沒有設置主鍵的必要,但不管你是否主動設置主鍵,數據庫都會有一個主鍵(若是你沒有主動設置,數據庫默認會有一個ROW_ID列,而這一列是你看不到的)。主鍵在連表、查詢等方面業務提供很大幫助,因此不管如何,創建一個主鍵是很必要的性能

三、保證較小的數據類型,避免空間浪費

較小的數據類型意味着較小的存儲代價,且數據庫可以更高效的利用緩存空間。存儲引擎都會採用不一樣的方式對索引或者數據緩存在內容中,較小的數據類型意味着在有限的內容空間中,你可以存儲更多有價值的數據。對於可變長度的varchar類型,若是咱們設置的是20長度,但實際佔用的只有10個長度,在載入內存時,佔用的空間依舊是20而不是10。因此對於可變長度類型,合理的長度更爲重要。

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

字段數量過多若是不是由於業務需且數據結構設計合理,大多會產生如下幾個問題:

  • 數據冗餘
  • 索引過多
  • 表體積大

這裏要提醒避免沒必要要的數據冗餘,針對數據冗餘的討論咱們暫且放在後面。

由於字段數據量多,每每查詢場景也會很是複雜多變,因此索引也就跟着變多了。索引多會直接影響到表的寫入性能,這個性能的損耗是很是大的,多是數以十倍計算的時間損耗。在寫入頻繁的場景,有可能會出現寫入瓶頸。因爲寫入而影響讀取性能的問題也不少。

表體積大意味着數據庫在讀取數據的時候須要掃描更多更大的數據塊,載入內存作緩存時也不能充分利用緩存帶來的效果。表大小對於表的性能也是由爲重要的。

分表是解決字段過多的一個解決方案,數據庫分表後,程序可能會改動比較大,但咱們應該追求合理完美的軟件設計,摒棄糟粕。分表後使用鏈表查詢,或者在程序中作兩次查詢。有些人可能會以爲連表,性能必定不好,其實否則。連表意味着咱們在同一個SQL中,可使用兩個索引,可是單表查詢咱們只能使用一個索引。若是索引設計合理,在大多數場景下(應該是大數據量場景),連表查詢會比單表查詢性能更高,甚至高出太多。曾經有過這樣的場景,優化分表後畫面變得沒好多了。

五、添加字段註釋

這裏只是爲了提示規範化數據庫設計。

相關文章
相關標籤/搜索