一、什麼是索引
索引是一種用於快速查詢到匹配條件的資料的資料結構,是用來加快查詢的技術。索引對良好的資料庫效能來說,是乙個非常重要的指標。當表中的資料量越來越大的時,其索引就越來越重要。
基本法則
索引應該構建在被用作《查詢條件》的字段上
索引型別
1) b+ tree索引
btree樹的特性:多路平衡樹
樹中每個節點最多包含m個子節點
每乙個葉子節點到根節點的距離是相同的
b+ tree樹的特點:
有n棵子樹的b+tree最多含有n個key,而btree最多含有n-1個key。
b+tree的葉節點儲存所有的key資訊,依key大小順序排列。
所有的非葉子節點都可以看作是key的索引部分,節點中只含有其子節點的最大(或最小)key。
適合b+tree索引的查詢型別:(全鍵值、最左字首、匹配範圍)
全值匹配:精確查詢某個鍵的值,如name=「jinjiao king」
匹配最左字首: 只精確匹配起頭部分 "jin%"
匹配範圍值: 從某個值到另乙個值
精確匹配某列並範圍匹配另一列
只訪問索引的查詢
不適合b+tree索引的場景:
如果不從最左列開始,索引無效,如比如乙個索引構建在(name、age)中,如果查詢語句中,查詢age>20的,這個索引就無效咯
不能跳過索引中的列 (stuid、name、age)
如果查詢中某個列是範圍查詢,那邊右側的列都無法再使用索引優化查詢
2)hash索引: 基於雜湊表
不適用於順序查詢或模糊匹配的查詢,只適合精確匹配的查詢,只有memory儲存引擎支援顯示hash索引,其他的都不支援
3)空間索引(r-tree)
只有myisam表支援空間索引
4)全文索引(fulltext)
索引的優點
索引可以降低伺服器需要掃瞄的資料量,減少io次數
索引可以幫助伺服器避免排序和使用臨時表
索引可以幫助將隨機i/o轉為順序i/o
高效能的索引策略
1)索引的字段,不要做算術運算,如果該列使用算術運算,那麼該列就無法使用索引咯
2)左字首索引;索引構建在字段的左側的多少個字元,要通過索引選擇性來評估
3) 多列索引 (and)
4)選擇合適的索引列次序,將選擇性最高的放在左側,範圍匹配的放右側
5) 為用來搜尋、分類、分組的資料列構建索引;意思就是說,適合索引的資料列是哪些where子句出現的、order by、group by子句**現的列
二)通過explain分析索引的有效性
使用方式:
explain select 獲取查詢執行計畫資訊
輸出說明:
id: 當前查詢語句中,每個select語句的編號
select_type:
簡單查詢: ******
簡單子查詢: subquery
用於from中的子查詢: derived
union語句的第乙個之後的select語句: union
table: 查詢對應的表
type: 即mysql決定如何去查詢表中行的方式
all:全表掃瞄
index:根據索引的次序進行全表掃瞄
range:範圍掃瞄,有範圍限制的根據索引來掃瞄。掃瞄位置始於索引中的某一點,結束於另一點
ref:基於等值的方式,根據索引返回表中匹配某單個值得所有行
eq_ref: 僅返回乙個行
const、system: 直接返回單個行(最佳的)
possible_keys:查詢可能會用到的索引
key: 查詢中使用到的索引
key_len: 在索引中使用的位元組數
ref: 在利用key欄位所表示的索引完成查詢時,所用的列或某常量值
rows: mysql估計為找到所有的目標行而需要讀取的行數(而不是最終的行數)
extra: 額外資訊
using index: 使用覆蓋索引
using where: mysql伺服器將在儲存引擎層檢索後,在進行一次過濾
using temporary: mysql對結果排序時會使用臨時表
using filesort:對結果使用乙個外部索引排序,基於檔案排序 (效能最差)
mysql索引語句 mysql建立索引語句格式
專案需要將某個表的某兩個字段新增唯一索引,保證這兩個欄位的值不能同時重複。alter table 表名 add unique index 索引名 欄位1,欄位2 當表中已經存在重複資料的時候,新增的時候就會報錯,這時候需要將資料去重。1 先查出來重複的資料 select from select 字段...
mysql建立刪除索引語句
1 檢視索引 show index from tb wz all 2 使用alter table語句建立索引。語法如下 alter table table name add index index name column list create index indexname on tablenam...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...