資料庫索引使用方式

2021-10-03 12:49:51 字數 3513 閱讀 6430

mysql5.5以上的預設儲存引擎innodb,只顯式支援btree( 事實上從資料結構上來講是b+樹,mysql稱之為btree)索引,對於頻繁訪問的表,innodb會建立自適應hash索引,

即在b樹索引基礎上建立hash索引,可以顯著提高查詢效率,使用者是無法自己指定的,除此之外還有hash索引和全文索引(fulltext索引)。 

btree索引

btree,顧名思義,就是所有的索引節點都按照balance tree的資料結構來儲存。btree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快訪問速度。

btree中,每個結點包含: 

1、本結點所含關鍵字的個數;

2、指向父結點的指標;

3、關鍵字;

4、指向子結點的指標; 

更詳細的b+樹介紹參考

hash索引

hash 索引由於使用了hash表結構,其檢索效率很高,索引的檢索可以一次定位,不像b+樹索引需要從根節點到枝節點,

所以 hash 索引的查詢效率要遠高於 b+樹 索引。但是,hash索引的使用範圍非常有限。

1.在mysql中,只有heap/memory引擎表才能支援雜湊索引,innodb引擎的自適應雜湊索引(adaptive hash index)不

能在建立索引時指定。

2.hash索引僅支援=,>=,<=這幾種條件運算,不支援排序,範圍內查詢,like等查詢。

3.hash索引不支援組合索引中部分索引的查詢。

4.當hash值重複較多時,索引速度可能不如btree索引。

fulltext索引

full-text索引就是我們常說的全文索引,他的儲存結構也是btree。主要是為了解決在我們需要用like查詢的低效問題。

只能解決』***%』的like查詢。如:字段資料為abcde,索引建立為a、ab、abc、abcd、abcde五個。

索引一般有:普通索引,唯一索引,復合索引這幾種型別。

唯一索引:唯一索引要求欄位中不會出現重複資料。

復合索引:將多個字段組合起來作為索引,必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用。

建立索引:

create index 索引名 on 表名(索引欄位名)
建立唯一索引:

create unique index 索引名 on 表名(索引欄位名)
建立復合索引:

create index 索引名 on 表名(索引欄位名1,索引欄位名2...)
檢視表中索引:

show index from 表名
刪除索引:

drop index 索引名 on 表名
檢視索引是否命中

mysql:當結果的type為 index時索引命中

explain +sql語句
oracle:

explain plan for+sql語句
1.避免判斷null值

應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num is null
可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0
2. 避免不等值判斷

應盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃瞄。

3.避免使用or邏輯

應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,

select id from t where num=1 or num=2
可以使用union all來進行查詢來命中索引如:

select id from t where num=1 union all select id from t where num=2
4 .慎用in和not in邏輯

in 和 not in 也要慎用,否則會導致全表掃瞄,如:

select id from t1 where num in(select id from t2 where id > 10)
此時外層查詢會全表掃瞄,不使用索引。可以修改為:

select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
此時索引被使用,可以明顯提公升查詢效率。

5.注意模糊查詢

下面的查詢也將導致全表掃瞄:

select id from t where name like '%abc%'
不要在like條件左邊加'%',這樣不會走索引模糊查詢如果是必要條件時,可以使用

select id from t where name like 'abc%'
來實現模糊查詢,此時索引將被使用。如果頭匹配是必要的,可以使用elasticsearch等全文搜尋引擎。

6.避免查詢條件中欄位計算

應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where num/2=100
應改為:

select id from t where num=100*2
7.避免查詢條件中對字段進行函式操作

應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where substring(name,1,3)='abc'
name以abc開頭的id

應改為:

select id from t where name like 'abc%'
8. 「=」左邊避免表示式運算

不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。

9.組合索引使用

在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

10exists

很多時候用 exists 代替 in 是乙個好的選擇:

select num from a where num in(select num from b)
用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

資料庫索引方式

1 b 樹 我們經常聽到b 樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了盡量保持樹的平衡,當然紅黑樹是二叉樹,但b 樹就不是二叉樹了,節點下面可以有多個子節點,資料庫開發商會設定子節點數的乙個最大值,這個值不會太小,所以b 樹一般來說比較矮胖,而紅黑樹就比較瘦高了。關於b 樹的插入,刪除,...

資料庫索引使用

1 不宜建立索引的情形 1 經常插入,修改和刪除的表 2 資料量比較小的表,因為查詢優化器在搜尋索引時所花費的時間可能會大於遍歷全表的資料所需要的時間 2.適合建立索引的情形 1 為where子句中出現的列建立索引 2 建立組合索引 3 為group by子句中出現的列建立索引 3.聚集索引的設計原...

mysql索引方式 MySQL資料庫的索引方式

mysql目前主要支援索引方法 b tree,hash,r tree b tree b tree是最常見的索引型別,所有的列都是排序過的,每個葉節點跟節點距離相等。因此,b tree適合查詢範圍的資料,可以直接支援資料排序。b tree在myisanyo中,索引檔案是記錄磁碟的位址 而在innodb...