首頁 資料庫 mysql教程 mysql索引詳解(總結)

mysql索引詳解(總結)

Jan 31, 2020 pm 05:38 PM
mysql

mysql索引詳解(總結)

上文《關於mysql 執行流程的解析》中我們主要介紹了sql語句在server層的執行過程

我們再來分析一下具體的語句在引擎層的執行步驟,CRUD的操作都跟索引相關,我們先了解一下索引

索引

##索引的出現其實就是為了提高資料查詢的效率,就像書的目錄

資料結構

常見的資料結構有雜湊表、有序數組和搜尋樹

#雜湊表是一種以鍵- 值(key-value)儲存資料的結構,我們只要輸入待查找的值即key, 就可以找到其對應的值即Value。哈希的想法很簡單,把值放在數組裡,用一個哈希函數把key 換算成一個位置,然後把value 放在數組的對應位置

不可避免地,多個key 值經過哈希函數的換算,會出現同一個值的情況。處理這種情況的一種方法是,拉出一個鍊錶

哈希表這種結構適用於只有等值查詢的場景

有序數組在等值查詢和範圍查詢場景中的效能就都非常優秀

如果只看查詢效率,有序數組就很好。但是,在需要更新資料的時候就麻煩了,你往中間插入一個記錄就必須得挪動後面所有的記錄,成本太高

##有序數組索引只適用於靜態儲存引擎

二元搜尋樹的特徵是:每個節點的左兒子小於父節點,父節點又小於右兒子

當然為了維持O(log(N)) 的查詢複雜度,你就需要保持這棵樹是平衡二元樹。為了做這個 保證,更新的時間複雜度也是 O(log(N))

二元樹是搜尋效率最高的,但是實際上大多數的資料庫儲存卻不使用二元樹。原因是,索引不只存在記憶體中,還要寫到磁碟上

為了讓一個查詢盡量少讀磁碟,就必須讓查詢過程存取盡量少的資料區塊。那麼,我們就不應該使用二元樹,而是要使用「N 叉」樹。這裡,「N 叉」樹中的「N」取決於資料塊的大小

N 叉樹由於在讀寫上的效能優點,以及適配磁碟的存取模式,已經被廣泛應用在資料庫引擎中了

InnoDB 的索引模型

在InnoDB 中,表都是根據主鍵順序以索引的形式存放的,這種儲存方式的表稱為索引組織表。 InnoDB 使用了B 樹索引模型,所以資料都是儲存在B 樹中的

每個索引在InnoDB 裡面對應一棵B 樹

根據葉子節點的內容,索引類型分為主鍵索引和非主鍵索引

主鍵索引的葉子節點存的是整行資料。在 InnoDB 裡,主鍵索引也被稱為叢集索引

非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 裡,非主鍵索引也被稱為二級索引

基於非主鍵索引的查詢需要多掃描一棵索引樹(回表)。因此,我們在應用程式中應該盡量使用主鍵查詢

#索引維護

B 樹為了維護索引有序性,在插入新值的時候需要做必要的維護

如果新插入的ID 值比原來的小,就相對麻煩了,需要邏輯上挪動後面的數據,空出位置

而更糟的情況是,如果所在的資料頁已經滿了,根據B 樹的演算法,這時候需要申請一個新的資料頁,然後挪動部分資料過去。這個過程稱為頁分裂。在這種情況下,性能自然會受影響。

除了效能外,頁分裂操作也會影響資料頁的使用率。原本放在一個頁的數據,現在分到兩個頁中,整體空間利用率降低約 50%。

當然有分裂就有合併。當相鄰兩頁由於刪除了數據,利用率很低之後,會將數據頁做合 並。合併的過程,可以認為是分裂過程的逆過程

自增主鍵的插入資料模式,正符合了我們前面提到的遞增插入的場景。每次插 入一筆新記錄,都是追加操作,都不涉及到挪動其他記錄,也不會觸發葉子節點的分裂。

而有業務邏輯的欄位做主鍵,則往往不容易保證有序插入,這樣寫資料成本相對較高

主鍵長度越小,普通索引的葉子節點就越小,普通索引佔用的空間也就越小

所以,從效能和儲存空間方面考量,自增主鍵往往是更合理的選擇

#有沒有什麼場景適合用業務欄位直接做主鍵的呢?還是有的。例如,有些業務的場景需求 是這樣的:

1.只有一個索引;

2.該索引必須是唯一索引。

這就是典型的 KV 場景

覆蓋索引

#

如果执行的语句是 select ID from t ,这时只需要查 ID 的 值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段

索引下推

满足最左前缀原则的时候,最左前缀可以用于在索引中定位记录。这时,你可能要问,那些不符合最左前缀的部分,会怎么样呢?

MySQL 5.6 引入的索引下推优化, 可以在索引遍历过 程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

最左前缀原则

不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索

在建立联合索引的时候,如何安排索引内的字段顺序?

这里我们的评估标准是,索引的复用能力。因为可以支持最左前缀,所以当已经有了 (a,b) 这个联合索引后,一般就不需要单独在 a 上建立索引了。因此,第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的

前缀索引

利用最左前缀原则可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串

但,这同时带来的损失是,可能会增加额外的记录扫描次数,因为索引相同需要进一步比较

使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查 询成本

可以通过统计索引上有多少个不同的值来判断要使用多长的前缀,从而减少扫描次数

前缀索引对覆盖索引的影响

使用前缀索引就用不上覆盖索引对查询性能的优化了,这也是你在选择是否使用前缀索引时需要考虑的一个因素

倒序存储和hash存储

对于类似于邮箱这样的字段来说,使用前缀索引的效果可能还不错。但是,遇到前缀的区 分度不够好的情况时,我们要怎么办呢?

第一种方式是使用倒序存储。如果你存储身份证号的时候把它倒过来存

第二种方式是使用 hash 字段。你可以在表上再创建一个整数字段,来保存身份证的校验码,同时在这个字段上创建索引

免费学习视频教程推荐:mysql视频教程

以上是mysql索引詳解(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

centos安裝mysql centos安裝mysql Apr 14, 2025 pm 08:09 PM

在 CentOS 上安裝 MySQL 涉及以下步驟:添加合適的 MySQL yum 源。執行 yum install mysql-server 命令以安裝 MySQL 服務器。使用 mysql_secure_installation 命令進行安全設置,例如設置 root 用戶密碼。根據需要自定義 MySQL 配置文件。調整 MySQL 參數和優化數據庫以提升性能。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

See all articles