Mysql原理解讀 索引

2021-10-24 19:25:51 字數 2436 閱讀 6831

我們主要以innodb引擎來了解索引

索引都儲存在磁碟的資料頁中

索引在大體上分為兩類:聚簇索引、非聚簇索引

他們都通過b+數實現

把索引值和資料儲存在一起的索引叫聚簇索引

mysql的主鍵預設使用聚簇索引

盡量使用自增字段作為主鍵,防止後續行資料插入導致索引樹中的節點**甚至是磁碟的資料頁**

把索引值和指向資料的值儲存在一起的索引叫非聚簇索引

像聯合索引、字首索引、唯一索引都屬於非聚簇索引

mysql中非聚簇索引把主鍵當做指向資料的值,在使用非聚簇索引時,會先從非聚簇索引樹中遍歷到對應索引,獲取葉子結點中指向聚簇索引樹的主鍵,然後遍歷聚簇索引樹,找到對應的主鍵索引,從而獲取葉子結點中的整條行資料,從非聚簇索引指向聚簇索引的過程叫回表

多個字段組合在一起的索引叫聯合索引,會把組成中的所有字段值儲存在葉子結點

聯合索引有乙個特點,允許乙個查詢只使用聯合索引最左側的部分字段,查詢條件的字段順序必須與聯合索引組合的字段順序一致,也叫做最做匹配原則

聯合索引的好處有兩個:

使用欄位的前多少位作為索引值的索引叫字首索引

字首索引的好處也有兩個:

字首索引的建立長度涉及到索引選擇性的問題:

索引選擇性是指不重複的索引值和表記錄的比值,即cou

nt(d

isti

nc

tcount(distinct

count(

dist

inct

索 引字

段)/c

ount

(∗

)索引字段)/count(*)

索引字段)/

coun

t(∗)

。當c ou

nt(d

isti

nc

tcount(distinct

count(

dist

inct

l ef

t(索引

字段,前

綴索引長

度)

)left(索引字段,字首索引長度))

left(索

引欄位,

字首索引

長度))

和原欄位索引選擇性最接近時,這時字首索引的長度即為最佳長度

保證值唯一的普通索引叫唯一索引

跟主鍵的區別:乙個表可以有多個唯一索引,但只能有乙個主鍵

唯一索引的特點:在執行插入更新事務時會先判斷值是否唯一,保證了唯一性但降低了效率

select

*from a where a = b;

select

*from a where a is

notnull

;#type為range

select

*from a where a is

null

;#type為ref

select

*from a where a in

(***,yyy,zzz)

select

*from a where a like

'***'

;# 走索引但是好像沒什麼意義

select

*from a where a like

'***%'

;# 走索引

select

*from a where a like

'%***'

;# 不走索引

select

*from a where a like

'%***%'

;# 不走索引

select

*from a where upper(a)

='***'

;# 對條件字段使用函式不會走索引

select

*from a where a = lower(

'***');

# 對值使用一部分函式會走索引

select

*from a where a = str_to_date(

'2021-09-21'

,'%y-%m-%d');

# 對值使用一部分函式不會走索引

select

*from a where a =

12345

;# a是varchar,條件值為int,會產生隱式轉換使索引失效

select

*from a where a/2=

12345

;# 運算作用在字段不走索引

select

*from a where a =

12345*2

;# 運算作用在值走索引

MySQL原理解讀 事務

資料庫事務有4個屬性,我們叫它們acid,分別為原子性 一致性 隔離性和永續性 1.1 原子性 atomicity 乙個事務內的操作是不可分割的,要麼都成功,要麼都失敗 事務把資料從乙個正確的狀態遷移到另乙個正確的狀態 併發事務相互隔離 多個事務之間的操作過程不可見 資料是持久化儲存的 比如存到磁碟...

dnn解讀 MT DNN原理解讀

最近大佬們接連放出大招。mt dnn還沒看,gpt2就出來了,爭取這兩天讀完把細節寫一下,一直堅持追蹤nlp預訓練模型的進展,自己工作中也用上了bert,希望nlp的發展越來越好。不了解bert的請戳這裡。正文分割線 1.mt dnn模型 1.1 模型結構 了解bert的朋友們一看這個圖估計就懂了,...

Vuex原理解讀

註冊vuex vue.usee vuex 建立store例項並匯出 export default newvuex.store getters mutations actions modules import store from store newvue mount vuex有乙個store建構函式...