MySQL 筆記整理(4) --深入淺出索引(上)

来源:https://www.cnblogs.com/dogtwo0214/archive/2019/02/27/10446048.html
-Advertisement-
Play Games

筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 4) --深入淺出索引(上) 一句話簡單來說,索引的出現其實就是為了提高數據查詢的效率,就像書的目錄一樣。 索引的常見模型 哈希表:哈希表是一種以Key-Value存儲數據的結構,只要輸入key,就可以找到對應的value。哈希的思路很簡單, ...


筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》

4) --深入淺出索引(上)

  一句話簡單來說,索引的出現其實就是為了提高數據查詢的效率,就像書的目錄一樣。

索引的常見模型

  哈希表:哈希表是一種以Key-Value存儲數據的結構,只要輸入key,就可以找到對應的value。哈希的思路很簡單, 把值放在數組裡,有一個哈希函數把key換算成一個確定的位置,然後把value放在數組的這個位置。不可避免地多個key值經過hash計算可能會出現同一個值,處理這種情況的一種方法是,拉出一個鏈表。查找時先通過key計算hash值找到這個鏈表,然後按順序遍歷鏈表。需要註意的是,hash存儲的value並不是遞增的,所以哈希索引做區間查詢的速度很慢。所以,哈希表這種結構適用於只有等值查詢的場景。比如Memcached及其他一些NoSQL引擎。

  有序數組:有序數組在等值查詢和範圍查詢場景中的性能都很優秀。如果僅僅看查詢效率,有序數組就是最好的數據結構了。但是,在需要更新數據時就很麻煩,在有序數組中間插入一個記錄,就必須挪動後面所有的記錄,成本太高。

  二叉搜索樹:二叉搜索樹的特點是:每個節點的左兒子小於父節點,父節點又小於右兒子。當然為了維持O(log(N))的查詢複雜度,需要保證這棵樹是平衡二叉樹,為了保證是平衡二叉樹所做的操作的時間複雜度也是O(log(N))。樹可以有二叉,也可以有多叉。多叉樹保證兒子從左到右遞增。二叉樹是搜索效率最高的,但是實際上大多數資料庫存儲並不使用二叉樹。其原因是,索引不止存在於記憶體中,還要寫到磁碟上。N叉樹由於在讀寫性能上的優點,以及適配磁碟的訪問模式,已經被廣泛應用。以InnoDB為例,這個N的值差不多是1200.當樹高是4時,已經可以存儲17億左右的數據了。

 

InnoDB索引模型:

  InnoDB使用了B+樹的索引模型。索引類型可以分為主鍵索引和非主鍵索引。

  主鍵索引的葉子節點存儲的是整行數據。在InnoDB中,主鍵索引也被稱為聚簇索引(clustered index)

  非主鍵索引的葉子節點內容是主鍵的值,在InnoDB中,非主鍵索引也被稱為二級索引(secondary index)

  因此,基於主鍵索引和普通索引的查詢有很大的區別。如果使用主鍵索引ID來查詢,只需要搜索ID對應的B+樹。而如果使用非主鍵索引K來進行查詢,需要先搜索K索引樹,得到主鍵索引的值,再到主鍵索引樹種進行搜索。這個過程稱為回表

索引維護:

  B+樹為了維護索引有序性,在插入新值的時候,需要做必要的維護。如果可以直接插入到末尾就會直接插入,否則則需要邏輯上挪動後面的數據,空出位置來。而如果要插入的位置的數據頁已經滿了,根據B+樹的演算法,需要申請一個新的數據頁,然後挪動部分數據到新的頁上,這個過程稱為頁分裂。整體空間利用率及性能都會受到相應影響。當然有分裂也有合併,暫且不談了。基於以上索引維護內容,解釋了為什麼大多數建表語句都要求有自增主鍵。Not NULL PRIMARY KEY AUTO_INCREMENT。這樣每次操作都會是追加操作,直接插入到末尾。另外,如果使用別的有業務邏輯的欄位來做主鍵一是很難保證有序性。二來由於非主鍵索引儲存的是主鍵的值,如果用較長的欄位做主鍵,則普通索引葉子節點就會相應較大,普通索引所占用的空間也會變大。

  當然事無絕對,在特定場景下也可能使用業務欄位做主鍵更合適。如:1.只有一個索引,2該索引是唯一索引。即典型的Key-Value場景。

上篇問題答案:

如果你是資料庫負責人,你有什麼方案來避免長事務呢?

  從應用端來說:1.確認是否使用了 set autocommit=0,你應該保證這個值為1。2.確認是否有不必要的只讀事務。3業務連接資料庫時,根據業務本身的預估,通過 SET MAX_EXECUTION_TIME命令控制每個語句的最長執行時間。

  從資料庫端來說: 1.監控 information_schema.Innodb_trx表,設置長事務閾值,超過就報警或kill掉。2.Percona的pt-kill工具不錯(這個筆者也不知道是什麼東東,感興趣可以搜一下)3.在業務功能的測試階段要求輸出所有general_log,分析日誌。4.如果使用的是MySQL5.6或更新版本,將innodb_undo_tablespaces設置成2(或更大的值),這樣即使真的回滾段過大,清理也更方便。(不明白)

問題:

  對於普通索引k,重建時可以這麼寫:

alter table T drop index k;
alter table T add Index(k);

  對於主鍵索引,可以這麼寫:

alter table T drop primary key;
alter table T add primary key(id);

  對於上面的重建索引的作法,說出你的理解。如果有不合時的,為什麼?更好的作法是什麼?


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

-Advertisement-
Play Games
更多相關文章
  • Linux的文件能否找到文件的創建時間取決於文件系統類型,在ext4之前的早期文件系統中(ext、ext2、ext3),文件的元數據不會記錄文件的創建時間,它只會記錄訪問時間、修改時間、該表時間。 Access 是訪問時間 Modify 是修改時間 Change 是改變時間 所以,對於ext、ext... ...
  • 前提:將磁碟中未分區磁碟進行分區操作 https://www.cnblogs.com/guoxiangyue/p/10033367.html 然後進行vg擴容 1 pvcreate /dev/sdc 2 lvs 3 vgextend centos /dev/sdc 4 lvextend -L +99 ...
  • 一、概述 docker的網路驅動有很多種方式,按照docker官網給出的網路解決方案就有6種,分別是:bridge、host、overlay、macvlan、none、Network plugins,每個網路都有自己的特點,當然應用場景也不同,比如當有多台主機上的docker容器需要容器間進行跨宿主 ...
  • ##sql語句為```SELECT COUNT(id) AS tp_count FROM `tableName` WHERE `status` = 0 AND `source` = 1 AND ( `end_time`-`add_time` > 2592000 AND `end_time`-`add... ...
  • 在項目開發中需要Thinkphp5讀取多個資料庫的數據,本文詳細介紹Thinkphp5多資料庫切換 一、在database.php配置預設資料庫連接 'type' => 'mysql','hostname' => '伺服器IP地址','database' => '資料庫名','username' = ...
  • 慢查詢日誌會將查詢過程中超出你設置的時間的查詢記錄下來,以便供開發者進行分析和優化。 1. 開啟慢查詢 1.1 查看當前設置 輸出 三個參數 slow_query_log ON/OFF ,使能開關 slow_query_log_file 慢查詢日誌目錄和文件名稱 long_query_time 超過 ...
  • 安裝包鏈接:https://pan.baidu.com/s/1WsQTeEQClM88aEqIvNi2ag 提取碼:s241 rlwrap-0.37-1.el6.x86_64.rpm 和 rlwrap-0.37-1.el6.i686.rpm,安裝perl依賴後如果還提示需要安裝perl,實則需要安裝 ...
  • 一、SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 這個報警告的原因簡單來說時因為slf4j的版本和log4j的版本不匹配。 解決辦法: 1.在你的maven庫中查找你的slf4j版本,若有兩個,最後選版本低的,因為本 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...