索引的建立、作用、及優化
1.索引是什麼
索引是資料庫幫助資料庫獲取資料的資料結構,好比書的目錄,加快資料庫的查詢速度。
2.索引的作用
1)通過唯一性索引,可以保證資料庫表中每一行資料的唯一性。(定義主鍵時伺服器自動建立)
2)可以加快資料的檢索速度。(快速定位)
3)實現表與表之間的參照完整性。
4)使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間
3.索引的建立與刪除
普通模式建立:create index 索引名 on 表名(列名1,列名2,…);
create index name_index on index_table(name);
此為在index_table表上的name列上建立乙個索引name_index。
在表上增加: alter table 表名add index 索引名 (列名1,列名2,…);
alter table index_table add index name_index(name)
建立表時指定索引:create table 表名 ( […], index 索引名 (列名1,列名 2,…) );
索引刪除
1)修改表的方式刪除索引
alter table 表名 drop index 索引名;
2)刪除主鍵索引
alter table 表名 drop primary key;
索引型別
1)主鍵索引 primary key:它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引。注意:乙個表只能有乙個主鍵。
2)唯一索引 unique:唯一索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。可以通過alter table table_name add unique (column);
3)普通索引 index:這是最基本的索引,它沒有任何限制;
4)組合索引,指多個字段建立的索引,只有在查詢條件中使用了建立索引的第乙個字段,索引才會被使用。
5)全文索引fulltext,主要用來查詢文字中的關鍵字。
4.索引建立的優缺點
建立索引的優勢
1)提高資料的檢索速度,降低資料庫io成本:使用索引的意義就是通過縮小表中需要查詢的記錄的數目從而加快搜尋的速度;
2)降低資料排序的成本,降低cpu消耗:索引之所以查的快,是因為先將資料排好序,若該字段正好需要排序,則真好降低了排序的成本。
建立索引的劣勢
1)占用儲存空間:索引實際上也是一張表,記錄了主鍵與索引字段,一般以索引檔案的形式儲存在磁碟上。
2)降低更新表的速度:表的資料發生了變化,對應的索引也需要一起變更,從而減低的更新速度。否則索引指向的物理資料可能不對,這也是索引失效的原因之一。
3)優質索引建立難:索引的建立並非一日之功,也並非一直不變。需要頻繁根據使用者的行為和具體的業務邏輯去建立最佳的索引。
5.使用方法
什麼時候適用索引
1)字段數值有唯一限制的,比如id;
2)頻繁作為 where 查詢條件的字段,尤其在資料表大的情況下;
3)經常要用於排序(order by),分組(group by)的列,因為索引已經排好序了;
什麼時候不適用索引
1)資料更新效能比查詢效能要求要高的情況下不要使用索引,因為資料的更新的同時索引也要進行維護和更新(加了索引查詢快但更新就會慢);
2)不要盲目的給表建太多索引,因為索引本身的儲存也要占用儲存空間,一旦更新操作頻繁反而降低新效能;
3)不要給不經常使用的列建索引,不怎麼查詢還建索引幹嘛;
4)不要給高重複值的列建索引,索引本身就是為了提高查詢速度,然而資料值高度重複,資料區別性不高,索引起不了效果)(比如說:性別);
5)表資料比較小的;
什麼時候索引失效
1)隱式轉換導致索引失效
由於表的字段tu_mdn定義為varchar2(20),但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效。
錯誤的例子:select * from test where tu_mdn=13333333333;
正確的例子:select * from test where tu_mdn=『13333333333』;
2)對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)
錯誤的例子:select * from test where id-1=9;
正確的例子:select * from test where id=10;
3)使用oracle內部函式導致索引失效.對於這樣情況應當建立基於函式的索引。
錯誤的例子:select * from test where round(id)=10; 說明,此時id的索引已 經不起作用了。
正確的例子:首先建立函式索引,create index test_id_fbi_idx on test(round(id));然後 select * from test where round(id)=10; 這時函式索引起作 用了。
4)like 「%_」 百分號在前。
5)復合索引未用左列字段。
6.索引優化
資料庫的優化方法有很多種,應用層來說,主要是基於索引的優化。
1)避免不必要的型別轉換;
例:表tab1中的列col1是字元型(char),則以下語句存在型別轉換:
select col1,col2 from tab1 where col1>10,
應該寫為: select col1,col2 from tab1 where col1>『10』。
2)增加查詢的範圍限制
例:以下查詢表record 中時間actiontime小於2023年3月1日的資料:
select * from record where actiontime < to_date (『20010301』 ,『yyyymm』)
修改如下: select * from record where
actiontime < to_date (『20010301』 ,『yyyymm』)
and actiontime > to_date (『20010101』 ,『yyyymm』)
使查詢在乙個完整的範圍之內。
3)盡量去掉"in"、「or」
含有"in"、"or"的where子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。
select count() from stuff where id_no in(『0』,『1』)(23秒)
可以考慮將in子句分開:
select count() from stuff where id_no=『0』
select count(*) from stuff where id_no=『1』
然後再做乙個簡單的加法,與原來的sql語句相比,查詢速度更快。
4)盡量去掉「<>」避免全表掃瞄。
5)去掉where子句中的is null和is not null
where字句中的is null和is not null將不會使用索引而是進行全表搜尋,因此需要通過改變查詢方式,分情況討論等方法,去掉where子句中的is null和is not null。
6)分解複雜查詢,用常量代替變數
對於複雜的where條件組合,where中含有多個帶索引的字段,考慮用if語句分情況進行討論;同時,去掉不必要的外來引數條件,減低複雜度,以便在不同情況下用不同欄位上的索引。
7)like子句盡量前端匹配
因為like引數使用的非常頻繁,因此如果能夠對like子句使用索引,將很高的提高查詢的效率。所以避免萬用字元『%』在字段的前面,避免全表掃瞄。
8)使用分割槽索引
在用分析命令對分割槽索引進行分析時,每乙個分割槽的資料值的範圍資訊會放入oracle的資料字典中。oracle可以利用這個資訊來提取出那些只與sql查詢相關的資料分割槽。
MySQL索引建立及優化
聯合索引中 索引建立在離散度大的字段上面 離散度指利用count distinct 獲取欄位的唯一值,唯一值越多的離散度越大 索引的優化 重複及冗餘索引 重複索引 指相同的列以相同的順序建立的同型別的索引,如下表 create table if not exists test id smallint...
Oracle 建立索引及SQL優化
oracle 建立索引及sql優化 資料庫索引 索引有單列索引 復合索引之說 如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。建設原則 1 索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行...
Oracle 建立索引及SQL優化
資料庫索引 索引有單列索引 復合索引之說 如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。建設原則 1 索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行查詢,並且檢索行數小於總表行數的5 ...