在一次編寫儲存過程的時候,發現從幾百萬條資料中查詢十幾條想要的結果發現速度非常慢,由於在裡面使用了游標,一開始懷疑是游標的問題,後來把游標換成while迴圈的寫法,速度並沒有多大提公升。後來有個精通資料庫的前輩指導可以用索引來提公升查詢速度。
使用之前我們來了解一下索引的概念和它的一些特點。
索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃瞄全表來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料。如下圖
優勢:可以快速檢索,減少i/o次數,加快檢索速度;根據索引分組和排序,可以加快分組和排序;
1、無索引,直接去讀表資料存放的磁碟塊,讀到資料緩衝區中再查詢需要的資料
2、有索引,先讀入索引表,通過索引表直接找到所需資料的實體地址,並把資料讀入資料緩衝區中
劣勢:索引本身也是表,因此會占用儲存空間,一般來說,索引表占用的空間的資料表的1.5倍;索引表的維護和建立需要時間成本,這個成本隨著資料量增大而增大;構建索引會降低資料表的修改操作(刪除,新增,修改)的效率,因為在修改資料表的同時還需要修改索引表;
1) 定義主鍵的資料列一定要建立索引。
2) 定義有外來鍵的資料列一定要建立索引。
3) 對於經常查詢的資料列最好建立索引。
4) 對於需要在指定範圍內的快速或頻繁查詢的資料列;
5) 經常用在where子句中的資料列。
6) 經常出現在關鍵字order by、group by、distinct後面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字後面的字段順序一致,否則索引不會被使用。
7) 對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。
8) 對於定義為text、image和bit的資料型別的列不要建立索引。
9) 對於經常訪問的列避免建立索引
9) 限制表上的索引數目。對乙個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。
常見的索引型別有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
create index index_name on table_name;
單列索引是乙個只基於表的乙個列上建立的索引。基本語法如下:
create index index_name on table_name (column_name);
使用唯一索引不僅是為了效能,同時也為了資料的完整性。唯一索引不允許任何重複的值插入到表中。基本語法如下:
create unique index index_name on table_name (column_name);
組合索引是基於乙個表的兩個或多個列上建立的索引。基本語法如下:
create index index_name on table_name (column1, column2);
drop index index_name;
至於為什麼索引可以調高查詢效率,大家可以去看看下面這篇。其實我沒看懂,哪位好心人看懂了可以給我講講嗎。o(╥﹏╥)o
select * from table_name where column_1 like '[張李王]三'; //表示column_1中有匹配張
三、李三、王三的都可以
select * from table_name where column_1 like '[^張李王]三'; //表示column_1中有匹配除了張
三、李三、王三的其他三都可以
//在模糊查詢中,%表示任意0個或多個字元;_表示任意單個字元(有且僅有),通常用來限制字串長度;表示其中的某乙個字元;[^]表示除了其中的字元的所有字元
新增完索引,可以在plsql的解釋計畫視窗檢視索引使用情況
--系統檢視存放是索引的名稱以及該索引是否是唯一索引等資訊。
select* from user_ind_columns where table_name=upper('sys_menuinfo')
--系統檢視存放的是索引名稱,對應的表和列等
如果where後面有or,這樣不會命中索引如:
select * from student where username=『小明』 or age=19;
如果想要or後面的也走索引的話,應該是建立兩個單列索引
like是以%開頭的不會命中索引如:
select * from student where username like %明
如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引如:
select * from student where username=『小明』 and age=19 and phone=1887821 ;
phone 定義的資料格式是字串,但是sql中使用的整型
沒有查詢條件,或者查詢條件沒有建立索引
查詢條件中,在索引列上使用函式(+/-*/)
select * from student where username=『小明』 and age-1=19 錯誤
select * from student where username=『小明』 and age=20 正確
採用 not in, not exist,!=, <> , is null , is not null 不會命中索引
MongoDB資料庫索引操作講解
索引就是用來加速查詢的。資料庫索引與書籍的索引類似 有了索引就不需要翻遍整本書,資料庫則可以直接在索引中查詢,使得查詢速度能提高幾個數量級。在索引中找到條目以後,就可以直接跳轉到目標文件的位置。一 建立索引 ensureindex 語法結構 db.collection.ensureindex key...
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...