常見資料庫優化方案(八)

2021-09-25 14:54:12 字數 2698 閱讀 9505

索引好比書的目錄,好比新華字典的拼音、偏旁部首查字,可以幫助人快速查詢到需要的內容,

當資料表記錄達到幾十w級別的時候,索引的作用非常明顯。所以建立索引也是需要消耗資源的。

索引型別有多種,雜湊、btree、全文索引等,其實不管什麼型別,都是為了在特定業務場景下方便快速查詢資料的演算法。所以建立索引以最常用查詢資訊作為建立索引的依據為最佳選擇。

手動建立索引

create index index_tb_

student_name

on tbl_student(stu_name)

使用索引(在where 之後加上索引,提高傳效率)

select * from tbl_student where stu_name=? 索引作為where查詢條件

原理:

當以某個字段建立乙個索引的時候,資料庫就會生成乙個索引頁,當我們查詢資料時,oracle會先查索引頁,這樣就能夠很快的查詢到要找的記錄。

注意:

如果表的列很少,不適合建索引。 

當執行過多次的insert,delete,update後,會出現索引碎片,影響查詢速度,我們應該對索引進行重組,其方法如下: 

drop index index_name; 

create index index_name on table(column) 

其實,就是刪除掉索引,重新再建立索引。

拓展:

對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會使用。

對於使用like的查詢,查詢如果是 「%aaa」 不會使用到索引,『aaa%』會使用到索引。

下列的表將不會使用索引:

1、如果條件中有or,即使其中有條件帶索引也不會使用。 

2、對於多列索引,不是使用的第一部分,則不會使用索引。 

3、like查詢是以%開頭 

4、如果列型別是字串,那一定要再條件中將資料使用引號引起來,否則不使用索引。(新增是,字串必須「) 

5、如果mysql估計使用全表掃瞄比使用索引快,則不使用索引。

alter table account add index my_index(login,name) 

//login就是最左邊的列,name就是右邊的列

如果表中有復合索引,索引作用在多列上,此時我們注意:對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般會被使用。

此時:

select * from account where name="timchen"

由於使用的是右側的列,此時索引是不會生效的,如何知道呢? 

新增explain 此時possible_key的值是為空的。

但是當我們使用左側的列是,explain的值不為空。

常見的索引方法有btree以及hash這兩種方法各有優劣

hash方法:

這種方法是將想要設定索引的一列整體使用hash演算法進行計算,並得到hash值排序在hash陣列上,所以hash索引可以實現一次定位(效率很高)

缺點:1、由於是經過hash值進行比較,所以只能進行等式比較,不可以進行範圍查詢

2、每一次都要進行全表掃瞄

3、由於雜湊值是按照順序排列的,但是雜湊值對映的真正資料在雜湊表中就不一定按照順序排列,所以無法利用hash索引來加速任何排序操作

3、不能用部分索引鍵來搜尋,因為組合索引在計算雜湊值的時候是一起計算的。

4、當雜湊值大量重複且資料量非常大時,其檢索效率並沒有btree索引高的。

btree方法:

btree方法以b+樹為儲存結構實現的。在innodb引擎中和myisam引擎中有很大區別(myisam引擎中索引檔案和資料檔案在儲存中時分開的|非聚集,而innodb引擎則是聚集索引)

btree是按照從左到右的順序來建立搜尋樹的。比如索引是(name,age,***),會先檢查name欄位,如果name欄位相同再去檢查後兩個字段。

所以當傳進來的是後兩個欄位的資料(age,***),因為建立搜尋樹的時候是按照第乙個字段建立的,所以必須根據name欄位才能知道下乙個欄位去**查詢。

所以傳進來的是(name,***)時,首先會根據name指定搜尋方向,但是第二個字段缺失,所以將name欄位正確的都找到後,然後才會去匹配***的資料。

建立索引的規則:

1、利用最左字首:mysql會一直向右查詢直到遇到範圍操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此時如果建立了(a,b,c,d)索引,那麼後面的d索引是完全沒有用到,當換成了(a,b,d,c)就可以用到。

2、不能過度索引:在修改表內容的時候,索引必須更新或者重構,所以索引過多時,會消耗更多的時間。

3、盡量擴充套件索引而不要新建索引

4、最適合的索引的列是出現在where子句中的列或連線子句中指定的列。

5、不同值較少的列不必要建立索引(性別)。

primary 主鍵。 就是 唯一 且 不能為空。

index 索引,普通的

unique 唯一索引。 不允許有重複。

fulltext 是全文索引,用於在一篇文章中,檢索文字資訊的。

常見資料庫分頁實現方案

隨著資料庫的發展,如今的資料庫可以儲存大量的資料,記憶體也是越來越大,但是無論您的記憶體多大,記憶體總是顯得不夠用,這時就要涉及到分頁,下文中將為大家帶來詳細的資料庫分頁操作 1.oracle select from select row rownum rownum from query sql r...

常見資料庫分頁實現方案

隨著資料庫的發展,如今的資料庫可以儲存大量的資料,記憶體也是越來越大,但是無論您的記憶體多大,記憶體總是顯得不夠用,這時就要涉及到分頁,下文中將為大家帶來詳細的資料庫分頁操作 1.oracle sql select from select row rownum rownum from query s...

常見資料庫的分頁實現方案

隨著資料庫的發展,如今的資料庫可以儲存大量的資料,記憶體也是越來越大,但是無論您的記憶體多大,記憶體總是顯得不夠用,這時就要涉及到分頁,下文中將為大家帶來詳細的資料庫分頁操作。1.oracle 1 2 select from selectrow rownum rownum from query sq...