MySQL 怎麼變快 如何讓mysql索引更快一點

2021-10-17 21:09:09 字數 1663 閱讀 7745

在 innodb 中,從二級索引回到主鍵索引查詢資料,這個過程稱作回表過程,而且這個回表過程是可以被優化的,這個優化就是利用覆蓋索引。

先說結論,如果乙個索引的字段包含了所有要查詢的字段,這個索引就稱作覆蓋索引,覆蓋索引可以減少回表過程,能有效提高查詢效率。

前面我們有說過,在 innodb 中資料都是儲存在 b+ 樹上,主鍵索引儲存了整行記錄,二級索引儲存了主鍵的值。

一次查詢操作,要麼是遍歷主鍵索引,要麼是遍歷二級索引,要麼就是先遍歷二級索引得到主鍵 id 的值,然後再到主鍵索引上通過主鍵 id 查詢滿足要求的記錄。

如果只遍歷一次 b+ 樹就能獲取到我們要的資料,即沒有回表過程,這個效率顯然是不錯的,這就是覆蓋索引的優勢。下面看個具體的例子。

mysql> create table user(

id int(11) primary key,

name varchar(20) not null,

age int(11),

*** int(11),

index (age)) engine=innodb;

依然是新建乙個表,建立索引,插入一些測試資料,注意這裡只是為了解釋說明覆蓋索引,並不表示 mysql 的真實執行方式,因為會涉及到 mysql 的優化器機制,這裡暫且不說了,以後再寫。

1 bob 16 1

2 kom 19 0

3 gum 18 1

4 tt 20 1

5 yy 25 1

建立乙個 user 表,給 age 字段新增乙個二級索引,並插入上面五條資料,然後看下面這條查詢語句。

select name from user where age between 18 and 21

我們來分析下這條 sql 的執行過程:

1、age 欄位上有索引,mysql 會先到 age 欄位的 b+ 樹上找到滿足條件的第乙個葉子節點(age=19),這個葉子節點上儲存了對應主鍵 id 的值 2,然後再到主鍵索引上找到 id 為 2 的這條記錄,同時把 name 欄位拿出來。

2、重複第一步的操作,繼續從 age 索引上的葉子節點往後遍歷找出滿足條件的第二個葉子節點,同樣回到主鍵上拿出 name 欄位的值,直到遍歷到不滿足條件的葉子節點(age=25)。

也就是說,這條 sql 語句雖然用到了索引,但是 age 索引上並沒有要查詢的 name 字段,所以只能回表到主鍵索引上查出 name 字段,所以這個過程其實是遍歷了個兩個 b+ 樹。

那麼我們刪除 age 這個單列索引,建立乙個覆蓋索引 (age,name), 把要查詢的 name 欄位也新增到索引中來。

#刪除原索引

drop index age on user

#新建覆蓋索引

alter table user add index age_name(age,name)

由於現在這個覆蓋索引上的字段包含了要查詢的 age 和 name 字段,免去了到主鍵索引上查詢資料的過程,其實也就是只遍歷了乙個 b+ 樹,可以大大提公升查詢效率。

新增索引雖然能提公升查詢效率,但索引也是需要占用額外空間的,而且索引還需要維護成本,所以通常加不加索引需要根據實際需求來權衡。

總之,在設計索引或者優化 sql 語句的時候,要盡量避免回表操作,所以使用覆蓋索引是一種常用的 sql 優化手段。

所以我們平時寫 sql 語句的時候,select 後面只寫查詢需要用到的字段,去掉不需要的字段,避免回表操作。

mysql怎麼優化 MYSQL如何優化?

mysql如何優化?結合你的經驗 1.資料庫的設計 盡量把資料庫設計的更小的佔磁碟空間.1 盡可能使用更小的整數型別.mediumint就比int更合適 2 盡可能的定義欄位為not null,除非這個字段需要null.3 如果沒有用到變長字段的話比如varchar,那就採用固定大小的紀錄格式比如c...

mysql2023年8月怎麼打出來 mysql詳解

header lotion index include index.html 輸出頁面 echo 輸出字串 print r 輸出陣列 針對不同的請求提供不同的回應 函式的特點 不呼叫不會執行 class indexcontroller framework start redirect url hea...

如何讓區域網內的其他電腦訪問本機的mysql

測試電腦 本機ip是125.216.250.67 其他電腦 125.216.250.68 第一步 先用其他電腦ping本機,看能否ping通 如上圖即為成功ping通了 第二步 開放mysql的全向 開啟mysql的命令視窗,修改訪問許可權為all,即set host where host loca...