資料都是存在優盤上,查詢資料時必須要進行io操作
索引在mysql中也叫『鍵』, 是儲存引擎用於快速找到記錄的一種資料結構
primary key
unique key
index key
primary key 與 unique key 除了有加速效果外還有約束效果
index只有加速效果
本質就是:通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。**
索引的影響:
1.在表中有大量的資料時,建立索引速度會很慢
2.建立好索引後,表的查詢變得高效,但是寫的會降低,增查時會巨慢
了解b+樹
只有葉子結點存放真實資料,根和樹枝節點存的僅僅是虛擬資料
查詢次數由樹的層級決定,層級越低次數越少
乙個磁碟塊兒的大小是一定的,那也就意味著能存的資料量是一定的。如何保證樹的層級最低呢?乙個磁碟塊兒存放占用空間比較小的資料項
思考我們應該給我們一張表裡面的什麼欄位字段建立索引能夠降低樹的層級高度》 主鍵id欄位
聚集索引(primary key)
聚集索引其實指的就是表的主鍵,innodb引擎規定一張表中必須要有主鍵。先來回顧一下儲存引擎。
myisam在建表的時候對應到硬碟有幾個檔案(三個)?
innodb在建表的時候對應到硬碟有幾個檔案(兩個)?frm檔案只存放表結構,不可能放索引,也就意味著innodb的索引跟資料都放在idb表資料檔案中。
特點:葉子結點放的一條條完整的記錄
輔助索引(unique,index)
輔助索引:查詢資料的時候不可能都是用id作為篩選條件,也可能會用name,password等字段資訊,那麼這個時候就無法利用到聚集索引的加速查詢效果。就需要給其他字段建立索引,這些索引就叫輔助索引
特點:葉子結點存放的是輔助索引字段對應的那條記錄的主鍵的值(比如:按照name欄位建立索引,那麼葉子節點存放的是:)
select name from user where name='jason';
上述語句叫覆蓋索引:只在輔助索引的葉子節點中就已經找到了所有我們想要的資料
select age from user where name='jason';
上述語句叫非覆蓋索引,雖然查詢的時候命中了索引欄位name,但是要查的是age欄位,所以還需要利用主鍵才去查詢
最後慢查詢日誌
設定好乙個時間檢測所有超出改時間的sql語句,然後對他們進行優化
查詢優化神器-explain
執行計畫:讓mysql預估執行操作(一般正確)
all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
id,email
慢:select * from userinfo3 where name='alex'
explain select * from userinfo3 where name='alex'
type: all(全表掃瞄)
select * from userinfo3 limit 1;
快:select * from userinfo3 where email='alex'
type: const(走索引)
慢查詢優化的基本步驟0.先執行看看是否真的很慢,注意設定sql_no_cache
1.where條件單錶查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單錶每個字段分別查詢,看哪個欄位的區分度最高
2.explain檢視執行計畫,是否與1預期一致(從鎖定記錄較少的表開始查詢)
3.order by limit 形式的sql語句讓排序的表優先查
4.了解業務方使用場景
5.加索引時參照建索引的幾大原則
6.觀察結果,不符合預期繼續從0分析
資料庫拓展的幾個方向
資料庫拓展的幾個方向 資料庫是一種資料集合軟體,可以將資料按照設定的規則進行儲存,以供後期 查詢,及再查詢和修正。隨著資料量越來越大和使用者使用量越來越大,資料庫需要同時面對大資料的搜尋 資料插入 修改及各關聯資料之間一致性,為了應對大併發的插入 更新和快速的資料檢索,我們必須對資料庫進行相關擴充套...
四 資料庫的橫向拓展策略
對於大規模資料來說,表的乙個改動都會帶來很大的變化。熟悉資料庫中每種資料型別的大小 考慮全部資料量 考慮表結構設計對資料大小的影響 1.索引使用b樹 磁碟裡面是分塊的,跨塊讀取的資料的速度消耗的時間比在同乙個塊中讀取資料的時間要多。b樹可以通過調整每顆樹中節點的大小,使之和磁碟中的大小一致,這樣每次...
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...