MySql 表索引設計原則

来源:https://www.cnblogs.com/tqlin/archive/2019/12/02/11973079.html
-Advertisement-
Play Games

索引的優點 1.加快數據的檢索速度,這是創建索引的最主要的原因; 2.通過創建唯一性索引,可以保證資料庫表中每一行數據的唯一性; 3.加速表和表之間的連接; 4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。 索引的缺點 1.創建索引和維護索引要耗費時間,這種時間隨著數據量 ...


索引的優點

  • 1.加快數據的檢索速度,這是創建索引的最主要的原因;

  • 2.通過創建唯一性索引,可以保證資料庫表中每一行數據的唯一性;

  • 3.加速表和表之間的連接;

  • 4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

索引的缺點

  • 1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。

  • 2.索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

  • 3.當對錶中的數據進行增加、刪除和修改的時候,索引也要同步動態的維護,這樣就降低了數據的增刪改速度。

所以單表數據太少,索引反而會影響速度;更新非常頻繁的數據不適宜建索引

索引設計原則

根據資料庫的功能,可以在資料庫設計器中創建三種索引

  • 唯一索引:唯一索引是不允許其中任何兩行具有相同索引值的索引
  • 主鍵索引:表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時, 它允許對數據的快速訪問
  • 聚集索引:表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表 只能包含一個聚集索引

選擇索引的最終目的是為了使查詢的速度變快。下麵給出的原則是最基本的準則,但不能拘泥於這些準則,應該根據應用的實際情況進行分析和判斷,選擇最合適的索引方式。

1.索引最左匹配原則

  • 索引可以簡單如一個列(a),也可以複雜如多個列(a, b, c, d),即聯合索引。
  • 如果是聯合索引,那麼key也由多個列組成,同時,索引只能用於查找key是否存在(相等),遇到範圍查詢(>、<、between、like左匹配)等就不能進一步匹配了,後續退化為線性查找。因此,列的排列順序決定了可命中索引的列數。

例子:

如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每個節點依次命中a、b、c,無法命中d。(很簡單:索引命中只能是相等的情況,不能是範圍匹配)

明白最左匹配原則,對我們設計索引和編寫高效SQL語句非常有幫助

2.為經常需要排序、分組操作的欄位建立索引

經常需要ORDER BY、GROUP BY、DISTINCT等操作的欄位,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。

分組欄位或者排序欄位應該創建索引

3.為常作為查詢條件的欄位建立索引

如果某個欄位經常用來做查詢條件,那麼該欄位的查詢速度會影響整個表的查詢速度。因此,為這樣的欄位建立索引,可以提高整個表的查詢速度。

Where 子句中經常使用的欄位應該創建索引

4.限制索引的數目

索引的數目不是越多越好。每個索引都需要占用磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。

5.儘量選擇區分度高的列作為索引

儘量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重覆的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大數據面前區分度就是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的欄位我們都要求是0.1以上,即平均1條掃描10條記錄

6.索引列不能參與計算

索引列不能參與計算,保持列“乾凈”,比如from_unixtime(create_time) = ’2019-12-02’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的欄位值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

即索引列不能帶函數,否則會導致索引失效

7.擴展索引

儘量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

8.條件帶like 註意事項

like 模糊查詢中,右模糊查詢(abc%)會使用索引,而(%abc)和(%abc%)會放棄索引而使用全表掃描

9.儘量使用數據量少的索引

如果索引的值很長,那麼查詢的速度會受到影響。例如,對一個CHAR(100)類型的欄位進行全文檢索需要的時間要比對CHAR(10)類型的欄位需要的時間要多。

10.儘量使用首碼來索引

如果索引欄位的值很長,最好使用值的首碼來索引。例如,TEXT和BLOG類型的欄位,進行全文檢索會很浪費時間。如果只檢索欄位的前面的若幹個字元,這樣可以提高檢索速度。

11.刪除不再使用或者很少使用的索引

表中的數據被大量更新,或者數據的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

12.=和in可以亂序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

13.聯合查詢

聯合查詢,子查詢等多表操作時關連欄位要加索引

資料


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

-Advertisement-
Play Games
更多相關文章
  • 今天介紹一個開源的C# WPF開源控制項庫,非常漂亮,重點是開源哦 WPF做桌面開發是很有優勢的,除了微軟自帶的控制項外,還有很多第三方的控制項庫,比如收費的Dev Express For WPF、Telerik For WPF等,及Github上開源免費的控制項庫如MaterialDesignInXAML ...
  • Mark Zhou寫了很不錯的一系列介紹C# 7的文章,雖然是2年多年前發佈的,不過對於不熟悉C# 7特性的同學來說,仍然有很高的閱讀價值。 原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/26/c-7-series-part-1-value-t ...
  • 配置 在 Startup.ConfigureServices 方法中,創建具有 AddAuthentication 和 AddCookie 方法的身份驗證中間件服務: AuthenticationScheme 傳遞到 AddAuthentication 設置應用程式的預設身份驗證方案。 如果有多個 ...
  • abp攔截器基本定義 攔截器介面定義: 預設抽象類定義: abp的攔截器實現是基於Autofac.Extras.DynamicProxy,這個包依賴兩個組件:Autofac、Castle.Core(實質上是調用內部組件DynamicProxy實現動態代理)。關於此組件的資料參考 ".NET 通過 A ...
  • 面向對象開發有三大特性(特點 / 特征) : 封裝, 繼承, 多態。我們今天主要討論封裝和繼承,多態會在下篇中討論。 一、封裝: 所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特征之一,是對象和類概念的主要特性 ...
  • 最近, 做的一個windows 桌面WPF程式, 需要資料庫支持。嘗試了 sql server 的開發版,使用EF , 效率太低。後來採用sqlite資料庫,中間踩坑無數。但最終完美的解決了這些問題。為了幫助廣大同好更好的使用sqlite ,今分享所有相關代碼。 sqlite , 是一款免費的資料庫 ...
  • 下圖為鏡像重命名後的鏡像名為uoj,現在要把這個鏡像中的mysql導出 運行如下命令: docker exec -it uoj mysqldump -uroot -proot app_uoj233 >/data/database_bak/app_uoj233.sql #註釋:uoj 為鏡像名 -u ...
  • 問題描述:我們配置DG的目的就是為了在主庫出現故障時,備庫能夠提供服務,保證業務的正常運行,switchover是用戶有計劃的進行停機切換,能夠保證不丟失數據,我記錄一下我進行switchover中的操作。 1.主庫(orcl) 備庫(orclstd) ,查看主庫上的狀態,角色orcl是主庫 SQL ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...