回表查詢
InnoDB索引分為兩大類,一類是聚集索引(Clustered Index),一類是非聚集索引(Secondary Index)
聚集索引(叢集索引):葉子節點中存的是整行數據,找到索引也就找到了數據,索引即數據,表中行的物理順序與鍵值的邏輯(索引)順序相同,一個表只能包含一個聚集索引。因為索引(目錄)只能按照一種方法進行排序。
非聚集索引(普通索引、非聚集索引、二級索引):非聚集索引的btree葉子節點中儲存的是當行資料的PK(主鍵)。例如MYISAM透過key_buffer把索引先快取到記憶體中,當需要存取資料時(透過索引存取資料),在記憶體中直接搜尋索引,然後透過索引找到磁碟對應數據,這也就是為什麼索引不在key buffer命中時,速度慢的原因。
為什麼非主鍵索引結構葉子結點儲存的是主鍵值?
減少了出現行移動或資料頁分割時二級索引的維護工作(當資料需要更新的時候,二級索引不需要修改,只需要修改叢集索引,一個表只能有一個叢集索引,其他的都是二級索引,這樣只需要修改叢集索引就可以了,不需要重新建構二級索引)
當使用非聚集索引時,為了取得具體數據,我們需要透過主鍵返回到聚集索引並查詢數據。著就叫回表查詢。掃描了2次索引樹。所以效率相對較低。
索引覆寫
索引覆寫就是解決回表查詢的一種方案。見名知意,就是查詢的所有列都被所使用的索引列覆蓋(可以是單列索引也可以是聯合索引,通常是聯合索引,單列索引很難覆蓋查詢的所有列)。
因為索引中已經包含了要查詢的欄位的值,因此查詢的時候直接傳回索引中的欄位值就可以了,不需要再到表中查詢,避免了對主鍵索引的二次查詢,也就提高了查詢的效率。
id為聚集索引,name為非聚集索引:
select name, age from t where name = 'lcc';
就需要回表查詢
索引覆寫:
在SQL中只查詢name字段。這樣name的索引就覆蓋到了所有的查詢欄位。
select name from t where name = 'lcc';
將name的索引修改為聯合索引(name, age ),之後還是執行select name, age from t where name = 'lcc'。這樣也覆蓋到了所有的查詢列。
因為覆寫索引必須要儲存索引的資料列值,而雜湊索引、空間索引和全文索引等都不儲存索引列值,因此只有使用B-Tree索引的資料可以做覆蓋索引。
進行索引覆寫查詢時,在explain(執行計畫)的Extra欄位可以看到【Using Index】的資訊。
索引覆寫的優點
索引條目通常遠小於資料行的大小,因為覆寫索引只需要讀取索引,大幅減少了資料的存取量。
索引是按照列值順序儲存的,對於IO密集的範圍查找會比隨機從磁碟讀取每一行資料的IO小得多。
有些儲存引擎例如MyISAM在記憶體中只快取索引,資料則依賴作業系統來緩存,因此要存取資料的話需要一次系統調用,使用覆蓋索引則避免了這一點。
針對InnoDB引擎下的資料庫表,覆寫索引因為InnoDB的叢集索引而非常實用。因為InnoDB的二級索引在葉子節點中保存了行的主鍵值,如果二級索引能夠覆蓋查詢,就避免了對主鍵索引的二次查詢。
哪些場景適合使用索引覆寫來最佳化SQL
#當不需要查詢整行記錄時;
#全表count查詢優化;
- Limit分頁查詢;
- 哪些情況下不要建立索引
- 表格記錄太少
- 索引下推優化是MySQL 5.6 引入的, 可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數建立聯合索引:
KEY `username` (`name`,`age`) )
select * from user2 where name like 'j%' and age=99;上面的查詢sql符合索引的最左前綴原則,所以將會用到username 索引####### 5.5中上面這個SQL 的執行流程是這樣的:############首先MySQL 的server 層呼叫儲存引擎取得第一個以j 開頭的username。 ############儲存引擎找到username=‘j’ 的第一筆記錄後,在B Tree 的葉子結點中保存主鍵id,此時透過回表操作,去主鍵索引中找到該筆記錄的完整數據,並傳回給server 層。 ###
server 層拿到資料之後,判斷該筆記錄的age 是否為99,如果age=99,就把該筆記錄回傳給客戶端,如果age!=99,那就丟棄該記錄。
5.6中上面這個SQL 的執行流程是這樣的:
MySQL 的server 層首先呼叫儲存引擎定位到第一個以j 開頭的username。
找到記錄後,儲存引擎並不急著回表,而是繼續判斷這條記錄的age 是否等於99,如果age=99,再去回表,如果age不等於99,就不去回表了,直接繼續讀取下一筆記錄。
以上是MySQL回表查詢與索引覆寫的差異是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器