mysql 整理索引 Mysql索引整理

2021-10-18 21:01:37 字數 2173 閱讀 5647

1、mysql基本單位是頁,大小為16kb=16384/1024

頁是為了增加查詢效率,減少io的互動(區域性性原理)

2、頁與頁之間是雙向鍊錶,插入的時候會根據主鍵id進行排序

單葉資料結構.jpg

3、在頁上有乙個頁目錄,相當於把資料進行分組,存放的是當前組最小的主鍵id,指標並且指向對應的資料

比如:每組存放4個,

目錄1=1;

目錄2=5

目錄3=9

當我們想要查詢id=7的時候,只需要在目錄2中查詢,如果找到就返回,否則查詢不到符合條件的資料,減少全表掃瞄

頁與頁雙向鍊錶.jpg

葉子節點與非葉子節點.jpg

4、mysql的儲存引擎innodb的資料結構為b+樹,只有葉子節點存在資料,非葉子節點存放的是索引頁目錄,中間不存放具體的資料

b+樹索引.jpg

5、索引的本質就是一種快速查詢的資料結構,目的就是快速查詢資料

聚集索引:主鍵索引,唯一

非聚集索引:非主鍵索引,可以有多個

索引掃瞄:按照b+樹從根節點從上到下進行查詢

全表掃瞄:從葉子節點從左到右進行查詢

6、比如一張表

create table t_table{

a int primary key,

b varchar,

c varchar,

d varchar,

e char

當建立索引:create index index_bcd on t_table(b,c,d)

多字段的索引會從左到右進行比較,bcd組合成乙個索引樹

這種索引可以叫做輔助索引,二級索引等等,

查詢的過程:先從索引樹中進行查詢

查詢到索引葉子節點,獲取對應資料,如果返回值是索引列,則直接返回

如果返回值中包含了非葉子節點的資料列,則需要根據葉子節點中儲存的id,再到資料樹中根據id查詢到返回的列

這種就叫做回表。

用輔助索引查詢的資料不完整,需要從主表中查詢完整的的資料。

7、最左字首原則

select * from t_table where c = 'xx' and d = 'aa';

sql中沒有查詢條件b,在索引樹的目錄中相當於:cd,無法比較大小,無法定位到那一頁,所以查詢不會走索引

模糊查詢也是相同的原理

如果是select * from t_table where b = 'xx' and d = 'aa';

相當於bd,在索引樹中是可以比較大小的,只不過是乙個範圍,把這個範圍的資料取出後再到mysql server中進行篩選過濾

8、a> 1,是走索引的,會先根據a = 1進行索引查詢,再定位到資料頁中的的資料,則在a=1後面的資料都是滿足條件的

b > 1可能會走索引,也可能不走索引,走索引肯會需要回表

會有分析器來確定,如果走索引的成本 > 全表掃瞄的成本,則進行全表掃瞄,否則走索引

9、select b from t_table

無where條件是會走索引的,因為輔助索引頁上不會儲存全部表資料,那就可以儲存更多行的資料,非葉子節點就可以儲存更多頁,速度更快

10、在mysql中資料型別不一致

比如資料列c1是數值型別,where c1 = '11'則會把字串11轉換成數值11,如果where c1 = 'aa',則會把字元型aa轉換成數值0

轉換失敗就為0

select 1= 1; true

select 1='a';false

select 0 = 'a';true

select 1= '1';true

如果c1是字元型,where c1 = 1,則不會走索引,因為需要將索引列中的c1全部轉換成數值型,成本太高,不走索引

如果where a + 1 = 4,也不會走索引因為需要在索引中計算a+1,成本太高

所以在sql中盡量不要使用函式

11、limit

越向後分頁查詢速度越慢,是因為它越向後找,起始頁查詢的成本越高

可以在上一次查詢的時候獲取他最後一條資料的idlast,在分頁的時候新增 and id > idlast limit 10000,100

12、order by走不走索引也需要看是否存在回表,走索引的成本是不是太高,

在mysql8以前建立索引不能指定公升降序,8之後可以指定索引的排序

create index (b asc,c asc,d desc)

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...