MySQL 資料庫設計總結

来源:https://www.cnblogs.com/qcloud1001/archive/2019/03/11/10509688.html
-Advertisement-
Play Games

本文由雲+社區發表 作者:漆洪凱 規則1 :一般情況可以選擇MyISAM存儲引擎,如果需要事務支持必須使用InnoDB存儲引擎。 註意:MyISAM存儲引擎 B tree索引有一個很大的限制:參與一個索引的所有欄位的長度之和不能超過1000位元組。另外MyISAM數據和索引是分開,而InnoDB的數據 ...


本文由雲+社區發表

作者:漆洪凱

規則1:一般情況可以選擇MyISAM存儲引擎,如果需要事務支持必須使用InnoDB存儲引擎。

註意:MyISAM存儲引擎 B-tree索引有一個很大的限制:參與一個索引的所有欄位的長度之和不能超過1000位元組。另外MyISAM數據和索引是分開,而InnoDB的數據存儲是按聚簇(cluster)索引有序排列的,主鍵是預設的聚簇(cluster)索引,因此MyISAM雖然在一般情況下,查詢性能比InnoDB高,但InnoDB的以主鍵為條件的查詢性能是非常高的。

規則2:命名規則。

  1. 資料庫和表名應儘可能和所服務的業務模塊名一致
  2. 服務與同一個子模塊的一類表應儘量以子模塊名(或部分單詞)為首碼或尾碼
  3. 表名應儘量包含與所存放數據對應的單詞
  4. 欄位名稱也應儘量保持和實際數據相對應
  5. 聯合索引名稱應儘量包含所有索引鍵欄位名或縮寫,且各欄位名在索引名中的順序應與索引鍵在索引中的索引順序一致,並儘量包含一個類似idx的首碼或尾碼,以表明期對象類型是索引。
  6. 約束等其他對象也應該儘可能包含所屬表或其他對象的名稱,以表明各自的關係

規則3:資料庫欄位類型定義

  1. 經常需要計算和排序等消耗CPU的欄位,應該儘量選擇更為迅速的欄位,如用TIMESTAMP(4個位元組,最小值1970-01-01 00:00:00)代替Datetime(8個位元組,最小值1001-01-01 00:00:00),通過整型替代浮點型和字元型
  2. 變長欄位使用varchar,不要使用char
  3. 對於二進位多媒體數據,流水隊列數據(如日誌),超大文本數據不要放在資料庫欄位中

規則4:業務邏輯執行過程必須讀到的表中必須要有初始的值。避免業務讀出為負或無窮大的值導致程式失敗

規則5:並不需要一定遵守範式理論,適度的冗餘,讓Query儘量減少Join

規則6:訪問頻率較低的大欄位拆分出數據表。有些大欄位占用空間多,訪問頻率較其他欄位明顯要少很多,這種情況進行拆分,頻繁的查詢中就不需要讀取大欄位,造成IO資源的浪費。

規則7:大表可以考慮水平拆分。大表影響查詢效率,根據業務特性有很多拆分方式,像根據時間遞增的數據,可以根據時間來分。以id劃分的數據,可根據id%資料庫個數的方式來拆分。

一.資料庫索引

規則8:業務需要的相關索引是根據實際的設計所構造sql語句的where條件來確定的,業務不需要的不要建索引,不允許在聯合索引(或主鍵)中存在多於的欄位。特別是該欄位根本不會在條件語句中出現。

規則9:唯一確定一條記錄的一個欄位或多個欄位要建立主鍵或者唯一索引,不能唯一確定一條記錄,為了提高查詢效率建普通索引

規則10:業務使用的表,有些記錄數很少,甚至只有一條記錄,為了約束的需要,也要建立索引或者設置主鍵。

規則11:對於取值不能重覆,經常作為查詢條件的欄位,應該建唯一索引(主鍵預設唯一索引),並且將查詢條件中該欄位的條件置於第一個位置。沒有必要再建立與該欄位有關的聯合索引。

規則12:對於經常查詢的欄位,其值不唯一,也應該考慮建立普通索引,查詢語句中該欄位條件置於第一個位置,對聯合索引處理的方法同樣。

規則13:業務通過不唯一索引訪問數據時,需要考慮通過該索引值返回的記錄稠密度,原則上可能的稠密度最大不能高於0.2,如果稠密度太大,則不合適建立索引了。

當通過這個索引查找得到的數據量占到表內所有數據的20%以上時,則需要考慮建立該索引的代價,同時由於索引掃描產生的都是隨機I/O,生其效率比全表順序掃描的順序I/O低很多。資料庫系統優化query的時候有可能不會用到這個索引。

規則14:需要聯合索引(或聯合主鍵)的資料庫要註意索引的順序。SQL語句中的匹配條件也要跟索引的順序保持一致。

註意:索引的順勢不正確也可能導致嚴重的後果。

規則15:表中的多個欄位查詢作為查詢條件,不含有其他索引,並且欄位聯合值不重覆,可以在這多個欄位上建唯一的聯合索引,假設索引欄位為 (a1,a2,...an),則查詢條件(a1 op val1,a2 op val2,...am op valm)m<=n,可以用到索引,查詢條件中欄位的位置與索引中的欄位位置是一致的。

規則16:聯合索引的建立原則(以下均假設在資料庫表的欄位a,b,c上建立聯合索引(a,b,c))

  1. 聯合索引中的欄位應儘量滿足過濾數據從多到少的順序,也就是說差異最大的欄位應該房子第一個欄位
  2. 建立索引儘量與SQL語句的條件順序一致,使SQL語句儘量以整個索引為條件,儘量避免以索引的一部分(特別是首個條件與索引的首個欄位不一致時)作為查詢的條件
  3. Where a=1,where a>=12 and a<15,where a=1 and b<5 ,where a=1 and b=7 and c>=40為條件可以用到此聯合索引;而這些語句where b=10,where c=221,where b>=12 and c=2則無法用到這個聯合索引。
  4. 當需要查詢的資料庫欄位全部在索引中體現時,資料庫可以直接查詢索引得到查詢信息無須對整個表進行掃描(這就是所謂的key-only),能大大的提高查詢效率。 當a,ab,abc與其他表欄位關聯查詢時可以用到索引
  5. 當a,ab,abc順序而不是b,c,bc,ac為順序執行Order by或者group不要時可以用到索引
  6. 以下情況時,進行表掃描然後排序可能比使用聯合索引更加有效 a.表已經按照索引組織好了 b.被查詢的數據站所有數據的很多比例。

規則17:重要業務訪問數據表時。但不能通過索引訪問數據時,應該確保順序訪問的記錄數目是有限的,原則上不得多於10.

二.Query語句與應用系統優化

規則18:合理構造Query語句

  1. Insert語句中,根據測試,批量一次插入1000條時效率最高,多於1000條時,要拆分,多次進行同樣的插入,應該合併批量進行。註意query語句的長度要小於mysqld的參數 max_allowed_packet
  2. 查詢條件中各種邏輯操作符性能順序是and,or,in,因此在查詢條件中應該儘量避免使用在大集合中使用in
  3. 永遠用小結果集驅動大記錄集,因為在mysql中,只有Nested Join一種Join方式,就是說mysql的join是通過嵌套迴圈來實現的。通過小結果集驅動大記錄集這個原則來減少嵌套迴圈的迴圈次數,以減少IO總量及CPU運算次數
  4. 儘量優化Nested Join內層迴圈。
  5. 只取需要的columns,儘量不要使用select *
  6. 僅僅使用最有效的過濾欄位,where 字句中的過濾條件少為好
  7. 儘量避免複雜的Join和子查詢 Mysql在併發這塊做得並不是太好,當併發量太高的時候,整體性能會急劇下降,這主要與Mysql內部資源的爭用鎖定控制有關,MyIsam用表鎖,InnoDB好一些用行鎖。

規則19:應用系統的優化

  1. 合理使用cache,對於變化較少的部分活躍數據通過應用層的cache緩存到記憶體中,對性能的提升是成數量級的。
  2. 對重覆執行相同的query進行合併,減少IO次數。
  3. 事務相關性最小原則

此文已由騰訊雲+社區在各渠道發佈

獲取更多新鮮技術乾貨,可以關註我們騰訊雲技術社區-雲加社區官方號及知乎機構號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 (本篇內圖片均來自丁奇老師的講解,如有侵權,請聯繫我刪除) 10) --MySQL為什麼有時會選錯索引? MySQL中的一張表上可以支持多個索引的,但是,往往你寫SQL語句的時候不會去主動指定使用哪個索引。也就是說,使用哪個索引是由MySQL來 ...
  • 我們在網站開發中,涉及MySQL資料庫查詢時,常常需要將兩個表或多個表聯合起來進行查詢數據,這就用到了MySQL中的JOIN函數。 JOIN函數有三種,分別是: LEFT JOIN 左連接查詢: 查詢兩個表中共有的數據,並以左邊的表為基準顯示左表的全部數據,顯示右表符合條件的數據, 不足的地方顯示N ...
  • 條件查詢 使用Where進行數據篩選結果為True的會出現在結果集裡面 select 欄位 from 表名 where 條件; # 例: select * from test_table where id > 2; # 篩選出id大於2的所有欄位 比較運算符 等於= 大於> 大於等於>= 小於< 小 ...
  • connect by 用於存在父子,祖孫,上下級等層級關係的數據表進行層級查詢。 語法格式: { CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH condition C ...
  • SQL優化是老生常談的話題。隨著關係型資料庫的發展,資料庫內部現在可以進行一些優化。在查詢分析,查詢檢查,資料庫內部會代數優化和物理優化之後再執行。但是,這需要我們理解資料庫內部規律才能進行。現在,我們需要找出RDBMS的優化規律,以寫出適合RDBMS自動優化的SQL語句。只看SQL優化總結,可以翻 ...
  • 通過本篇文章我們來學習一下CASE表達式的基本使用方法。 CASE表達式有簡單 CASE表達式(simple case expression)和搜索 CASE表達式(searched caseexpression)兩種寫法,它們分別如下所示。 CASE 表達式的寫法 我們在編寫 SQL 語句的時候需 ...
  • 此篇介紹下psql下dblink的使用方式,幫助自己記錄以備後需。dblink是psql下的擴展功能,可以實現在一個資料庫中遠程操作另外一個資料庫,是實現跨庫的一種方法。下麵步入正文。 安裝dblink 安裝方式自行百度(psql資料庫預設是安裝了的,可先在伺服器上查看),安裝完後$PGHOME下的 ...
  • 我只是搬運工。。。 1.我也下載了,好像不能超過500M每次,100個站。下了也不會看。有沒有高手能介紹下專門下載某個省的所有氣象站氣溫資料的方法,從而計算出每個站每月的平均氣溫。。格式為txt。2 http://www.esrl.noaa.gov/psd/data/gridded/reanalys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...