《MySQL——索引筆記》

目錄

    • 回表
    • 覆蓋索引
    • 最左前綴原則
    • 聯合索引的時候,如何安排索引內的字段順序?
    • 索引下推
    • 重建索引問題
    • 聯合主鍵索引和 InnoDB 索引組織表問題
    • in與between的區別

回表

回到主鍵索引樹搜索的過程,我們稱為回表。

覆蓋索引

覆蓋索引就是在這次的查詢中,所要的數據已經在這棵索引樹的葉子結點上了。

select ID from T where k between 3 and 5

在這里插入圖片描述
ID 的值已經在 k 索引樹上了,因此可以直接提供查詢結果,不需要回表.
由于覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。

覆蓋索引的第二個使用:在聯合索引上使用,也可以避免回表。
如果現在有一個高頻請求,要根據市民的身份證號查詢他的姓名。我們可以建立一個(身份證號、姓名)的聯合索引。它可以在這個高頻請求上用到覆蓋索引,不再需要回表查整行記錄,減少語句的執行時間。

最左前綴原則

聯合索引先根據第一個字段排序,如果第一個字段有相同的,就按照第二個字段排序。
在這里插入圖片描述
只要滿足最左前綴,就可以利用索引來加速檢索。這個最左前綴可以是聯合索引的最左 N 個字段,也可以是字符串索引的最左 M 個字符。

聯合索引的時候,如何安排索引內的字段順序?

第一原則:
如果通過調整順序,可以少維護一個索引,那么這個順序往往就是需要優先考慮采用的。
如果我們有個頻繁的要求:根據姓名找到該人身份證,那么應該建立聯合索引:(name,ID)
反之,如果我們有個頻繁的要求:根據該人身份證找到該人姓名,那么應該建立聯合索引:(ID,name)

索引下推

索引覆蓋是你要查的信息在二級索引中已經有了,就不需要回表。索引下推是你的過濾條件有一部分符合了最左前綴,那么會用上索引,如果此時不符合最左前綴的部分剛好有聯合索引中的字段,那么在利用最左前綴進行索引查詢的同時,會根據這些字段多做一步過濾,減少索引查詢出來的條數,這樣就減少了回表次數。
如:


mysql> select * from tuser where name like '張%' and age=10 and ismale=1;
1 每次都需要回表
2 下推,先濾除不符合的,再回表

重建索引問題

假設,我們有一個主鍵列為 ID 的表,表中有字段 k,并且在 k 上有索引。

mysql> create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;

如果你要重建索引 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);

上面這兩個重建索引的作法對此有什么理解?
為什么要重建索引?
索引可能因為刪除,或者頁分裂等原因,導致數據頁有空洞,重建索引的過程會創建一個新的索引,把數據按順序插入,這樣頁面的利用率最高,也就是索引更緊湊、更省空間。
理解
不論是刪除主鍵還是創建主鍵,都會將整個表重建。所以連著執行這兩個語句的話,第一個語句就白做了。
推薦使用:

alter table T engine=InnoDB

聯合主鍵索引和 InnoDB 索引組織表問題

有這么一個表:


CREATE TABLE `geek` (`a` int(11) NOT NULL,`b` int(11) NOT NULL,`c` int(11) NOT NULL,`d` int(11) NOT NULL,PRIMARY KEY (`a`,`b`),KEY `c` (`c`),KEY `ca` (`c`,`a`),KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

既然主鍵包含了 a、b 這兩個字段,那意味著單獨在字段 c 上創建一個索引,就已經包含了三個字段了呀,為什么要創建“ca”“cb”這兩個索引?同事告訴他,是因為他們的業務里面有這樣的兩種語句:


select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

為了這兩個查詢模式,這兩個索引是否都是必須的?為什么呢?
表記錄:
主鍵 a,b 的聚簇索引組織順序相當于 order by a,b ,也就是先按 a 排序,再按 b 排序,c 無序。

abcd
123d
132d
143d
213d
222d
234d

索引 ca 的組織是先按 c 排序,再按 a 排序,同時記錄主鍵:
這個跟索引 c 的數據是一模一樣的。

cab
213
222
312
314
321
423

索引 cb 的組織是先按 c 排序,再按 b 排序,同時記錄主鍵:

cba
222
231
312
321
341
432

所以,結論是 ca 可以去掉,cb 需要保留。

in與between的區別

--1.
select * from T where k in(1,2,3,4,5)
--2.
select * from T where k between 1 and 5

1.in 內部的數字是未知的,不知道是否有序,是否連續等,所以你只能一個一個去看。
2.一個已知的升序、范圍查詢,只需定位第一個值,后面遍歷就行了。

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

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

相關文章

計算凸多邊形面積的算法

1. 思路: 可以將凸多邊形(邊數n > 3)劃分為 (n - 2) 個三角形,分別運用向量叉積計算每個三角形的面積,最后累加各個三角形的面積就是多邊形的面積。 2. 求多邊形面積的算法模板:   定義點的結構體 str…

Windows CE開發常見問題解答

轉自: http://blog.csdn.net/slyzhang/article/details/6110490 1.怎樣在一個控件獲得焦點時打開軟鍵盤?比如一個EditBox獲得焦點后,這個時候自動打開軟鍵盤,這樣可以方便用戶輸入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO…

Julia中的supertype()函數

Julia| supertype()函數 (Julia | supertype() function) supertype() function is a library function in Julia programming language, it is used to get the concrete supertype of the given type (data type). supertype()函數是Julia編程語言中的庫函數,用于…

《操作系統知識點整理》

目錄進程與線程比較多線程同步與互斥生產者與消費者哲學家就餐問題讀者寫者問題進程間通信管道消息隊列共享內存信號量信號Socket鎖互斥鎖與自旋鎖讀寫鎖樂觀鎖與悲觀鎖死鎖進程與線程比較 進程是資源(包括內存、打開的文件等)分配的單位,線…

for,foreach,iterator的用法和區別

相同點&#xff1a; 三個都可以用來遍歷數組和集合不同點&#xff1a;1.形式差別 for的形式是 for&#xff08;int i0;i<arr.size();i&#xff09;{...} foreach的形式是 for&#xff08;int i&…

和菜鳥一起學linux總線驅動之初識spi驅動主要結構

既然知道了協議了&#xff0c;那么就可以開始去瞧瞧linux kenerl中的spi的驅動代碼了&#xff0c;代碼中有很多的結構體&#xff0c;還是對主要的結構體先做個了解吧&#xff0c;那樣才可以很好的理解驅動。主要是include/linux/spi.h 首先是SPI的主機和從機通信接口&#xff0…

操作系統大內核和微內核_操作系統中的內核

操作系統大內核和微內核A Kernel is the central component of an Operating System. The Kernel is also said to be the heart of the Operating System. It is responsible for managing all the processes, memory, files, etc. The Kernel functions at the lowest level …

《MySQL——鎖》

全局鎖是什么&#xff1f;全局鎖有什么用&#xff1f;全局鎖怎么用&#xff1f; 全局鎖主要用在邏輯備份過程中&#xff0c;對于InnoDB 引擎的庫&#xff0c;使用–single-transaction; MySQL 提供了一個加全局讀鎖的方法&#xff0c;命令是 Flush tables with read lock (FTW…

搜索引擎Constellio及Google Search Appliances connectors

做搜索產品的時候發現國外一個同類型的產品contellio&#xff0c;發現功能比較強大&#xff0c;先記錄下來 貌似可以添加文檔 網站 以及數據庫等不同類型的數據源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

dig下載_DIG的完整形式是什么?

dig下載DIG&#xff1a;副監察長 (DIG: Deputy Inspector General) DIG is an abbreviation of the Deputy Inspector General. It is a high-level position in the Indian Police Service. The officers who already offered service on Senior Superintendent of Police (SS…

分類器是如何做檢測的?——CascadeClassifier中的detectMultiScale函數解讀

原地址&#xff1a;http://blog.csdn.net/delltdk/article/details/9186875 在進入detectMultiScal函數之前&#xff0c;首先需要對CascadeClassifier做初始化。 1. 初始化——read函數 CascadeClassifier的初始化很簡單&#xff1a; cv::CascadeClassifier classifier; cl…

<MySQL>何時使用普通索引,何時使用唯一索引

如果能夠保證業務代碼不會寫入重復數據&#xff0c;就可以繼續往下看。 如果業務不能保證&#xff0c;那么必須創建唯一索引。 關于查詢能力 普通索引和唯一索引在查詢能力上是沒有很大差別的。 如&#xff1a;select id from T where k5 1、普通索引查找到滿足條件的第一個記…

Web版OutLook,利用POP接收郵件服務器郵件

一直想做一個Web版的OutLook&#xff0c;所以才萌生這個想法&#xff0c;其實以前也接觸過這方面的東西。于是上網找了找&#xff0c;漫天的都是Jmail來接收&#xff0c;好吧&#xff0c;既然大家都在用我也就下載下來試試了。 什么&#xff0c;怎么總是報錯呢&#xff1f;原來…

abs std::abs_ABS的完整形式是什么?

abs std::absABS&#xff1a;防抱死制動系統 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

ubuntu 使用

shell 命令歷史搜索 &#xff1a; ctrl r使能 session 選擇界面&#xff1a;安裝gnome-session-fallback安裝lwqq轉載于:https://www.cnblogs.com/JonnyLulu/p/3600263.html

漢字速查使用方法簡介

《漢字速查》&#xff08;HanziSearcher&#xff09;是一個支持全漢字字典和詞典的檢索工具。其界面如下所示。 界面上方為工具欄。 左方為字典和詞典檢索欄。 右方在啟動時顯示版權信息和作者的聯系方式&#xff0c;在執行檢索時&#xff0c;顯示檢索結果。 檢索方法 漢字速查…

android jni示例_Android服務示例

android jni示例A service is a component that runs in the background for supporting different types of operations that are long running. The user is not interacted with these. These perform task even if application is destroyed. Examples include handling of…

《MySQL——選錯索引,該如何做》

如果不斷地刪除歷史數據和新增數據&#xff0c;MySQL有時會選錯索引。 選擇索引是優化器的工作&#xff0c;優化器優化時會考慮的因素&#xff1a;掃描行數、是否需要排序、是否使用臨時表 MySQL通過統計索引上的基數&#xff0c;作為索引的區分度。 統計方法時采樣統計&#x…

LPWSTR 類型的實參與const.char *類型形參不兼容

CString csPlus; CString csSummand; m_PlusNumber.GetWindowTextW(csPlus); m_Summand.GetWindowTextW(csSummand); int nPlus atoi(csPlus.GetBuffer(0)); //將編輯框文本轉換成整數// int nPlus atoi(strcpy(csPlus.GetBuffer(10),"aa")); csPlus.ReleaseBu…

空間換時間,把遞歸的時間復雜度降低到O(2n)

遞歸算法的時間復雜度除非只有前兩項&#xff0c;否則都不是線性的&#xff0c;并且相當耗費內存。我們用最常見的的fibonacci數列來說明&#xff1a; function fibonacci(n){if( n 0 || n 1){return n;} else {return fibonacci(n - 1) fibonacci(n - 2);} } 這是一種最常見…