Mysql 建索引規范

索引規范

今天在建線上表的時候,做了一個varchar的索引,運維說varchar的索引會占用很大的內存。
于是 上網搜了一下建索引規范

一、建表規約

【強制】(1) 存儲引擎必須使用InnoDB
解讀:InnoDB支持事物、行級鎖、并發性能更好,CPU及內存緩存頁優化使得資源利用率更高。


【強制】(2)每張表必須設置一個主鍵ID,且這個主鍵ID使用自增主鍵(在滿足需要的情況下盡量短),除非在分庫分表環境下。
解讀:由于InnoDB組織數據的方式決定了需要有一個主鍵,而且若是這個主鍵ID是單調遞增的可以有效提高插入的性能,避免過多的頁分裂、減少表碎片提高空間的使用率。而在分庫分表環境下,則需要統一來分配各個表中的主鍵值,從而避免整個邏輯表中主鍵重復。

【強制】(3)必須使用utf8mb4字符集
解讀:在Mysql中的UTF-8并非“真正的UTF-8”,而utf8mb4”才是真正的“UTF-8”。

【強制】(4) 數據庫表、表字段必須加入中文注釋
解讀:大家都別懶

【強制】(5) 庫名、表名、字段名均小寫,下劃線風格,不超過32個字符,必須見名知意,禁止拼音英文混用。
解讀:約定

【強制】(6)單表列數目必須小于30,若超過則應該考慮將表拆分
解讀:單表列數太多使得Mysql服務器處理InnoDB返回數據之間的映射成本太高

【強制】(7)禁止使用外鍵,如果有外鍵完整性約束,需要應用程序控制
解讀:外鍵會導致表與表之間耦合,UPDATE與DELETE操作都會涉及相關聯的表,十分影響SQL的性能,甚至會造成死鎖。

【強制】(8)必須把字段定義為NOT NULL并且提供默認值
解讀:a、NULL的列使索引/索引統計/值比較都更加復雜,對MySQL來說更難優化 b、NULL這種類型Msql內部需要進行特殊處理,增加數據庫處理記錄的復雜性;同等條件下,表中有較多空字段的時候,數據庫的處理性能會降低很多 c、NULL值需要更多的存儲空,無論是表還是索引中每行中的NULL的列都需要額外的空間來標識

【強制】(9)禁用保留字,如DESC、RANGE、MARCH等,請參考Mysql官方保留字。

【強制】(10)如果存儲的字符串長度幾乎相等,使用CHAR定長字符串類型。
解讀:能夠減少空間碎片,節省存儲空間。

【建議】(11)在一些場景下,考慮使用TIMESTAMP代替DATETIME。
解讀:a、這兩種類型的都能表達"yyyy-MM-dd HH:mm:ss"格式的時間,TIMESTAMP只需要占用4個字節的長度,可以存儲的范圍為(1970-2038)年,在各個時區,所展示的時間是不一樣的;b、而DATETIME類型占用8個字節,對時區不敏感,可以存儲的范圍為(1001-9999)年。

  • 【建議】(12)當心自動生成的Schema,建議所有的Schema手動編寫。
    解讀:對于一些數據庫客戶端不要太過信任。

二、SQL規約

【建議】 (1) 為了充分利用緩存,不允許使用自定義函數、存儲函數、用戶變量。
解讀:如果查詢中包含任何用戶自定義函數、存儲函數、用戶變量、臨時表、Mysql庫中的系統表,其查詢結果都不會被緩存。比如函數NOW()或者CURRENT_DATE()會因為不同的查詢時間,返回不同的查詢結果。


【強制】(2)在查詢中指定所需的列,而不是直接使用“ *”返回所有的列
解讀:a)讀取不需要的列會增加CPU、IO、NET消耗 b)不能有效的利用覆蓋索引

【強制】(3)不允許使用屬性隱式轉換
解讀:假設我們在手機號列上添加了索引,然后執行下面的SQL會發生什么?explain SELECT user_name FROM parent WHERE phone=13812345678; 很明顯就是索引不生效,會全表掃描。


【建議】(4)在WHERE條件的屬性上使用函數或者表達式
解讀:Mysql無法自動解析這種表達式,無法使用到索引。


【強制】(5)禁止使用外鍵與級聯,一切外鍵概念必須在應用層解決。
解讀:外鍵與級聯更新適用于單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。


【建議】(6)應盡量避免在WHERE子句中使用or作為連接條件
解讀:根據情況可以選擇使用UNION ALL來代替OR


【強制】(7)不允許使用%開頭的模糊查詢
解讀:根據索引的最左前綴原理,%開頭的模糊查詢無法使用索引,可以使用ES來做檢索。

索引規約

【建議】(1)避免在更新比較頻繁、區分度不高的列上單獨建立索引
解讀:區分度不高的列單獨創建索引的優化效果很小,但是較為頻繁的更新則會讓索引的維護成本更高


【強制】(2) JOIN的表不允許超過五個。需要JOIN的字段,數據類型必須絕對一致; 多表關聯查詢時,保證被關聯的字段需要有索引。
解讀:太多表的JOIN會讓Mysql的優化器更難權衡出一個“最佳”的執行計劃(可能性為表數量的階乘),同時要注意關聯字段的類型、長度、字符編碼等等是否一致。


【強制】(3)在一個聯合索引中,若第一列索引區分度等于1,那么則不需要建立聯合索引。
解讀:索引通過第一列就能夠完全定位的數據,所以聯合索引的后邊部分是不需要的。


【強制】(4)建立聯合索引時,必須將區分度更高的字段放在左邊
解讀:區分度更高的列放在左邊,能夠在一開始就有效的過濾掉無用數據。提高索引的效率,相應我們在Mapper中編寫SQL的WHERE條件中有多個條件時,需要先看看當前表是否有現成的聯合索引直接使用,注意各個條件的順序盡量和索引的順序一致。


【建議】(5)利用覆蓋索引來進行查詢操作,避免回表
解讀:覆蓋查詢即是查詢只需要通過索引即可拿到所需DATA,而不再需要再次回表查詢,所以效率相對很高。我們在使用EXPLAIN的結果,extra列會出現:“using index”。這里也要強調一下不要使用“SELECT * ”,否則幾乎不可能使用到覆蓋索引。


【建議】(6)在較長VARCHAR字段,例如VARCHAR(100)上建立索引時,應指定索引長度,沒必要對全字段建立索引,根據實際文本區分度決定索引長度即可。
解讀:索引的長度與區分度是一對矛盾體,一般對字符串類型數據,若長度為20的索引,區分度會高達90%以上,則可以考慮創建長度例為20的索引,而非全字段索引。例如可以使用SELECT COUNT(DISTINCT LEFT(lesson_code, 20)) / COUNT(*) FROM lesson;來確定lesson_code字段字符長度為20時文本區分度。


【建議】(7)如果有ORDER BY的場景,請注意利用索引的有序性。ORDER BY最后的字段是聯合索引的一部分,并且放在索引組合順序的最后,避免出現file_sort的情況,影響查詢性能。
解讀:1、假設有查詢條件為WHERE a=? and b=? ORDER BY c; 存在索引:a_b_c,則此時可以利用索引排序。2、反例:在查詢條件中包含了范圍查詢,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a_b無法排序。


【建議】(8)在where中索引的列不能某個表達式的一部分,也不能是函數的參數。
解讀:即是某列上已經添加了索引,但是若此列成為表達式的一部分、或者是函數的參數,Mysql無法將此列單獨解析出來,索引也不會生效。


【建議】 (9)我們在where條件中使用范圍查詢時,索引最多用于一個范圍條件,超過一個則后邊的不走索引。
解讀:Mysql能夠使用多個范圍條件里邊的最左邊的第一個范圍查詢,但是后邊的范圍查詢則無法使用。

【建議】 (10)在多個表進行外連接時,表之間的關聯字段類型必須完全一致
解讀:當兩個表進行Join時,字段類型若沒有完全一致,則加索引也不會生效,這里的完全一致包括但不限于字段類型、字段長度、字符集、collection等等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35915.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構—圖的應用

6.4圖的應用 概念回顧—生成樹 生成樹:所有頂點均由邊連接在一起,但不存在回路的圖。 一個圖可以有許多棵不同的生成樹、含有n個頂點 n-1 條邊的圖不一定是生成樹所有生成樹具有以下共同特點 生成樹的頂點個數與圖的頂點個數相同;生成樹是圖的…

如何運用小程序技術閉環運營鏈路?

如何通過線上小程序獲取用戶線索,提高企業抗風險能力,建立有效的營銷數字化系統一直是困擾每一個小程序開發者與運營者的問題。 當我們選擇使用小程序設計自己的運營流程時,從「推廣」到「轉化」,再到最終的「留存」都是運營過程…

ABeam×Startup丨德碩管理咨詢(深圳)創新研究團隊前往靈境至維·既明科技進行拜訪交流

近日,德碩管理咨詢(深圳)(以下簡稱“ABeam-SZ”)創新研究團隊一行前往靈境至維既明科技有限公司(以下簡稱“靈境至維”)進行拜訪交流,探討線上虛擬空間的商業模式。 現場合影 &…

前臺測試轉后臺優化歷險記,應屆生薪資8K逆襲,從此扶搖直上九萬里!

優橙教育每一期都會有不少從前臺測試轉到后臺的小伙伴應邀而來,其實每個人的經歷都是大致相同的,這時候肯定會有很多小伙伴問,為什么出來花錢出來參加培訓而不是在項目上轉呢? 或許是因為在項目上摸爬滾打太久了,吃不下…

Qt掃盲-QWidget理論使用總結

QWidget理論使用總結 一、概述二、頂層 控件 和子 控件三、復合控件四、自定義控件和繪制五、大小提示和大小策略六、事件七、一組函數和屬性八、QWidget樣式表九、透明度和雙緩沖十、創建半透明窗口 一、概述 widget 是用戶界面的最小單位:它從window系統接收鼠標…

Jsoup爬取簡單信息

1. 豆瓣圖書最受關注 1.1 創建SpringBoot項目或者Maven項目 1.2 引入jsoup <dependency><!-- jsoup HTML parser library https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3<…

Qt應用開發(基礎篇)——堆棧窗口 QStackedWidget

一、前言 QStackedWidget繼承于QFrame&#xff0c;QFrame繼承于QWidget&#xff0c;是Qt常用的堆棧窗口部件。 框架類QFrame介紹 QStackedWidget堆棧窗口&#xff0c;根據下標切換&#xff0c;一次顯示一個小部件&#xff0c;常用于應用界面切換、圖片輪詢播放等場景。 二、QSt…

用Java調用C#的WebService接口

這是一個用Java調用C#版程序的例子,廢話不多說,上代碼: C#接口代碼: using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description;[WebService(Namespace = " http://www.ta…

如何在Springboot項目中讀取zip壓縮包并且把文件導出成zip壓縮包

文章目錄 設想場景實現流程小結 設想場景 為方便老師錄入大量學生圖片信息&#xff0c;在添加照片時&#xff0c;學生的相關資料以身份證號碼圖片描述命名如 &#xff08;1231231234567一寸照片.jpg&#xff09; &#xff08;1231231234567身份證正面照片.jpg&#xff09; &am…

中小企業體育代言:探索費用策略與實際操作

隨著體育市場的不斷擴大和企業品牌的不斷提升&#xff0c;中小型企業正逐漸將目光投向了體育明星代言&#xff0c;希望通過這一策略來提升品牌知名度、美譽度&#xff0c;進而吸引目標消費者的注意力并提升銷售量。然而&#xff0c;中小型企業請體育明星代言的費用究竟是多少呢…

docker 離線模式-部署容器

有網絡的情況下下載需要的鏡像 比如(下面以tomcat為例子&#xff0c;其他鏡像類似) docker pull tomcat打包鏡像文件到本地 docker save tomcat -o tomcat.tar將tomcat.tar 上傳到內網服務器&#xff08;無外網環境&#xff09; 導入鏡像 docker load -i tomcat.tar創建容器…

element-ui的el-dialog,簡單的封裝。

el-dialog是使用率很高的組件 使用el-dialog很多都是按照文檔的例子&#xff0c;用一個變量控制是否顯示&#xff0c;再來一個變量控制標題。 如果我這個對話框多個地方使用的話還要創建多個變量&#xff0c;甚至關閉之后還要清空一些變量&#xff0c;應該可以簡化一點。我寫…

Windows Hyper-V Ubuntu 22.04 LTS安裝

文章目錄 Ubuntu準備Hyper-V啟用虛擬化支持services.msc 打開服務列表&#xff0c;關注Hyper-V服務是否啟動打開管理器創建虛擬機 啟動備份 Ubuntu 下載Ubuntu-Desktop&#xff0c;這是個iso文件。 準備 20GB以上的磁盤空間&#xff0c;ubuntu安裝后的虛擬磁盤文件超過15GB一…

C/C++test兩步完成CMake項目靜態分析

您可能一直在靜態分析中使用CMake。但您是否嘗試過將Parasoft C/Ctest與CMake一起使用嗎&#xff1f;以下是如何使用C/Ctest在基于CMake的項目中運行靜態分析的詳細說明。 CMake是用于構建、測試和打包軟件的最流行的工具之一。Parasoft C/Ctest通過簡化構建管理過程&#xff…

【Minecraft】Fabric Mod開發完整流程1 - 環境配置與第一個物品

前言 Fabric 是 Minecraft 一款非官方的模組 API,與 Forge mod 不同。它以輕量級和高性能為設計目標,專注于支持新版本的 Minecraft。 Fabric 和 Forge 在各自的加載編譯流程上差別很大&#xff0c;所以你很難看見有同時支持二者的 mod&#xff0c;除非做了兼容性處理 Fabri…

【Java筆記】對象存儲服務MinIO

1 MinIO簡介 MinIO基于Apache License v2.0開源協議的對象存儲服務&#xff0c;可以做為云存儲的解決方案用來保存海量的圖片&#xff0c;視頻&#xff0c;文檔。由于采用Golang實現&#xff0c;服務端可以工作在Windows,Linux, OS X和FreeBSD上。配置簡單&#xff0c;基本是復…

mac-右鍵-用VSCode打開

1.點擊訪達&#xff0c;搜索自動操作 2.選擇快速操作 3.執行shell腳本 替換代碼如下&#xff1a; for f in "$" doopen -a "Visual Studio Code" "$f" donecommand s保存會出現一個彈框&#xff0c;保存為“用VSCode打開” 5.使用

基于百度語音識別API智能語音識別和字幕推薦系統——深度學習算法應用(含全部工程源碼)+測試數據集

目錄 前言總體設計系統整體結構圖系統流程圖 運行環境模塊實現1. 數據預處理2. 翻譯3. 格式轉換4. 音頻切割5. 語音識別6. 文本切割7. main函數 系統測試工程源代碼下載其它資料下載 前言 本項目基于百度語音識別API&#xff0c;結合了語音識別、視頻轉換音頻識別以及語句停頓…

【人工智能124種任務大集合】-集齊了自然語言處理(NLP),計算機視覺(CV),語音識別,多模態等任務

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下人工智能124種任務大集合&#xff0c;任務集合主要包括4大類&#xff1a;自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;、語音識別、多模態任務。 我這里整理了124種應用場景任…

JavaScript基礎之基于數據類型和引用數據類型

原文合集地址如下&#xff0c;有需要的朋友可以關注 本文地址 數據類型 JavaScript的數據類型有7中&#xff0c;包括6個基本類型和一個引用類型 基本數據類型&#xff1a;number, string, boolean, null, undefined, symbol 引用數據類型&#xff1a;object&#xff08;數組…