為了提高資料庫的查詢效率,然後我們會給一些字段增加索引,但是大家有沒有考慮過,索引是什麼?我們為什麼要用索引?增加了索引就一定快嗎?如何實現按照索引查詢呢?索引的資料結構有哪些呢?它分為哪幾類呢?大家別懵,下面就深入去探個究竟吧!
索引是為了加快對錶中資料行的檢索而建立的一種分散儲存的資料結構;通俗來說嗎,索引就類似於書的目錄,通過目錄找內容,效率比隨便翻要提高不少呢;
那我們為什麼要用索引呢,它的好處適合什麼呢?
1. 減少儲存引擎掃瞄的數量;
2. 把隨機io變成順序io
3. 幫助我們在分組、排序的時候,避免用臨時表
4. 保證資料庫表中每一行資料的唯一性
5. 加速表與表之間的連線
看到了索引折磨多的好處,是不是又心生邪念,那把資料庫表中的每個欄位都設定為索引,那我的查詢速度不嗖嗖的!
如果折磨想,並且折磨做,哈哈,你就抱著被子哭去吧;
1. 索引的建立也是需要占用物理空間的,如果每個欄位都是索引,那麼需要的物理空間會很大;
有人說,沒事,我記憶體大;
2.那好,建立索引和維護索引都是很耗費實踐的,而且隨著資料量的增加而增多;
3.當我們進行update、insert、 delete的時候,索引也需要動態維護,這樣就降低了維護效率;
你又要說了,這也不行,那些不行,你光說了索引的好處,那我到底把哪個字段設定為索引嘛!ծ‸ծ
只要符合下面原則,就可以:
離散型越高,選擇性越好
最左匹配原則;
盡可能的擴充套件索引,不要新建立索引
索引列不能參與計算,盡量保持列「乾淨」
單個多列組合索引和多個單列索引的檢索查詢效果不同,因為在執行sql時,mysql只能使用乙個索引,會從多個單列索引中選擇乙個限制最為嚴格的索引
認真聽,敲小黑板了!重要的事情來了~~~~~~~
避免在where子句上加上函式,這樣會無法命中索引,導致索引失效;
將 索引的列設定為 not null ,否則會導致索引失效,而全表掃瞄;
如果進行全表掃瞄,也就是我們所說的「select *」,然後會索引失效;
沒有遵循最左匹配原則;
使用 !=、like進行條件查詢;
字串沒有新增單引號;
主鍵索引
alter table
table_nameadd primary key (
column)
唯一索引
alter table
table_nameadd unique (
column)
普通索引
alter table
table_nameadd index index_name (
column)
全文索引
alter table
table_nameadd fulltext (
column)
多列索引
alter table
table_nameadd index index_name (
column1,
column2,
column3)
mysql中主要的資料結構有兩種:雜湊索引、btree索引
雜湊索引
對於它來說,底層的資料結構就是雜湊表,所以我們在進行單挑記錄查詢的時候,可以選擇雜湊索引,效能是最快的,其餘場景,建議使用btree索引;
2.btree索引
mysql的btree索引使用的是b樹中的b+tree;
MySQL 基礎篇 之索引
一 索引的引入 索引定義 索引是由資料庫表中一列或者多列組合而成,其作用是提高對錶中資料的查詢速度。類似於圖書的目錄,方便快速定位,尋找指定的內容,如一本1000頁的書,如果沒有目錄,你想要知道指定的內容,必須要1頁1頁翻過去,是不是很浪費時間?二 索引的優缺點 優點 提高查詢資料的速度。缺點 建立...
mysql 優化之索引篇(一)
一 索引的優點 a.索引可以加快查詢速度 b.索引是最有效的查詢優化條件 c.使用索引可以不用全表掃瞄 二 索引的缺點 a.降低了寫入的速度 insert update 寫入時不僅要求寫入到資料行,還要更新全部索引 索引的建立原則 a.盡量為用來搜尋 分類或分組的資料列編制索引,不要為輸出顯示的列編...
MySQL之資料儲存索引篇 二
要知道資料庫選擇b tree結構作為索引的原因,需要先了解電腦科學中的區域性性原理和磁碟預讀。電腦科學中著名的區域性性原理 當乙個資料被用到時,其附近的資料也通常會馬上被使用。程式執行期間所需要的資料通常比較集中。由於磁碟順序讀取的效率很高 不需要尋道時間,只需很少的旋轉時間 因此對於具有區域性性的...