我們主要以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建構函式...