MySQL閱讀筆記 8 表訪問

2022-02-10 11:18:18 字數 3181 閱讀 5159

全表掃瞄

使用索引查詢

針對主鍵或唯一二級索引等值查詢

針對普通二級索引等值查詢

針對索引列範圍查詢(in子句也可以劃分為範圍查詢)

掃瞄整個索引列

即使訪問通過索引列查詢資料,也不一定會使用索引,當mysql優化器判斷查詢二級索引+回表的代價比全表掃瞄小的時候才會使用索引,如果有大量回表操作,執行隨機i/o的成本太大,則會傾向於使用全表掃瞄

const:通過主鍵或者唯一二級索引常數等值比較定位一條資料記錄

ref普通索引常數等值比較定位到一條或者多條記錄

ref_or_null普通索引列常數等值比較並且還把該列值為null也查出來(col is null)

range索引列進行範圍查詢(即:in、between、不等關係等)

index:查詢結果集覆蓋索引,並且查詢條件沒有符合最左原則沒有用到索引(在聯合索引中)

該種訪問方式因為查詢結果覆蓋聯合索引因此只是掃瞄二級索引取出符合條件的記錄,沒有回表操作

all:直接從聚集索引最小記錄開始依次掃瞄

所謂合併就是將在一定條件下將查詢條件中用到的所有索引進行一次查詢得到結果集(主要是主鍵值)在回表前對得到的主鍵值進行和並(主要是intersection(求交集)union(求並集))操作

因為讀取索引是順序i/o,而回表是隨機i/o,讀取多個二級索引後對結果(主鍵值)進行合併(交集或者並集),可能減少回表的記錄數(交集),也可能將離散的記錄主鍵填充為連續的主鍵,從而在聚集索引上進行一些順序i/o

intersection合併:

查詢中where用到多個索引條件用and連線,則在一定條件下可能會用到intersection合併(條件是:如果是普通索引則必須是等值匹配,如果是聯合索引則每個列必須等值匹配;條件中的主鍵可以範圍查詢 )

union合併:

查詢中where用到多個索引條件用or連線,則在一定條件下可能會用到union合併(條件是:如果是普通索引則必須是等值匹配,如果是聯合索引則每個列必須等值匹配;條件中的主鍵可以範圍查詢 )

需要滿足上述條件是因為,二級索引是以索引列+主鍵儲存的,並且排序先參照索引列再參照主鍵列,通過上述規則查詢二級索引得到的結果集都是按照主鍵值排序的,對這種結果集求交集、求並集的演算法效率會很高o(n)​具體的演算法就是逐個取出兩個索引最小的主鍵值進行比較,求交集是不相等則丟棄當前小值取下乙個值與另乙個集合比較,如果相等加入到結果集;求並集是逐步取最小值,不同則加入到結果集,如果相同則丟棄乙個。

連線的本質就是將各個連線表的記錄依次按照條件取出來匹配組合,並將結果返回給使用者。其中第乙個查詢的表稱為驅動表之後查詢的表都稱為被驅動表。​兩表連線中如果將不匹配的記錄(mysql將不匹配列以列值為null的方式)返回到結果集中的連線方式叫做外連線;結果集只包含匹配的記錄叫做內連線(內連線whereon語句等價)

一般將單錶過濾條件放到where語句中,將連線表過濾條件放到on語句中(也稱為連線條件

驅動表只查詢一次,每條查詢的結果都需要到被驅動表中查詢匹配的記錄,需要多次訪問被驅動表這個過程是涉及到從磁碟到記憶體載入資料,可能效率會很低,因此為了盡可能減少訪問被驅動表的次數mysql設計者提出了join buffer的概念,在連線查詢前開闢一塊固定大小的記憶體區域,將若干驅動表查詢過濾後得到的結果集儲存到這塊記憶體區域中(最好全部存下),然後掃瞄被驅動表與記憶體中的驅動表結果集做匹配,整個過程只掃瞄了一遍被驅動表,並且整個過程都是在記憶體中完成的,可以顯著減少了被驅動表不斷的從磁碟載入到記憶體的i/o代價,這種方式叫做基於塊的巢狀連線(block nested-loop join)

join buffer區域可以通過系統變數join_buffer_size設定大小

訪問mysql表 mysql表的連線

兩個表 分別是表a和表b 1.內連線 只返回滿足條件的資料 inner join 例項應用 select from a inner join b on a.a1 b.b1 那麼我們會得到這樣的資料 2.外連線 外連線又分左外連線和右外連線 左外連線,只返回滿足左表的資料 左表資料全部會顯示 右外連線...

MySQL筆記8 表的建立 增刪改

二 向表中插入資料 三 複製表 按照查詢結果建立新錶 四 將查詢結果插入一張表中 五 修改表中的資料 六 刪除表中的資料 七 刪除一整張表 語法 creat table 表名 資料型別 占用位元組數 說明int 4位元組整型 bigint 8位元組長整型,類似long float double 浮點...

Redis 閱讀筆記 跳躍表

跳躍表是一種有序資料結構,他通過每個節點維持多個指向其他節點的指標,從而達到快速訪問的目的。跳躍表平均支援o logn 最壞o n 複雜度的節點查詢,還可以通過順序性來批量處理節點。redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素的數量比較多,或者有序集合中元素的成員是比...