Ⅰ 為了測試資料庫查詢的效率是否提升,經常使用索引來實現,請問什麼是索引 有什麼作用 原理是什麼
一、什麼是索引?
索引就像是書的目錄,是與表或者視圖關聯磁碟上的結構,可以加快從表中內或者視圖容中檢索行的速度。素銀中包含表或者視圖中的一行或者多列生成的鍵。這些鍵存儲在一個結構(BTree)中,使SQL可以快速有效的查找與鍵值關聯的行。
二、有什麼用?即索引的優點
建立索引的行可以保證行的唯一性,生成唯一的word
建立索引可以有效的縮短數據的檢索時間
建立索引可以加快表與表之間的 連接
為用來排序或者是分組的欄位添加索引可以加快和排序順序
無索引,直接去讀表數據存放的磁碟快,督導數據緩沖區中再去查找需要的數據
有索引,先讀入索引表,通過索引表直接去找到需要數據的物理地址,並把數據讀入數據緩沖區中。
三、索引的原理
通過不斷地縮小想要獲取數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查找方式來鎖定數據。
Ⅱ 哪位高手跟我說說,資料庫中'索引'的用法,怎麼創建,和在select語句中怎麼使用
建立資料庫的目的是管理大量數據,而建立索引的目的就是提高數據檢索效率,改善資料庫工作性能,提高數據訪問速度。當查詢大量數據時不建索引帶條件的查詢會很慢的,索引的創建不同的資料庫有不同的寫法,oracle的寫法是create index 索引名 on 表名();
在select 語句中的where條件每個欄位都要建索引.
索引原理
索引的基本概念索引是一種特殊類型的資料庫對象,它與表有著密切的聯系。索引是為檢索而存在的。如一些書籍的末尾就專門附有索引,指明了某個關鍵字在正文中的出現的頁碼位置,方便我們查找,但大多數的書籍只有目錄,目錄不是索引,只是書中內容的排序,並不提供真正的檢索功能。可見建立索引要單獨佔用空間;索引也並不是必須要建立的,它們只是為更好、更快的檢索和定位關鍵字而存在。再進一步說,我們要在圖書館中查閱圖書,該怎麼辦呢?圖書館的前台有很多叫做索引卡片櫃的小櫃子,裡面分了若乾的類別供我們檢索圖書,比如你可以用書名的筆畫順序或者拼音順序作為查找的依據,你還可以從作者名的筆畫順序或拼音順序去查詢想要的圖書,反正有許多檢索方式,但有一點很明白,書庫中的書並沒有按照這些卡片櫃中的順序排列——雖然理論上可以這樣做,事實上,所有圖書的脊背上都人工的粘貼了一個特定的編號①,它們是以這個順序在排列。索引卡片中並沒有指明這本書擺放在書庫中的第幾個書架的第幾本,僅僅指明了這個特定的編號。管理員則根據這一編號將請求的圖書返回到讀者手中。這是很形象的例子,以下的講解將會反復用到它。SQLS在安裝完成之後,安裝程序會自動創建master、model、tempdb等幾個特殊的系統資料庫,其中master是SQLS的主資料庫,用於保存和管理其它系統資料庫、用戶資料庫以及SQLS的系統信息,它在SQLS中的地位與WINDOWS下的注冊表相當。master中有一個名為sysindexes的系統表,專門管理索引。SQLS查詢數據表的操作都必須用到它,毫無疑義,它是本文主角之一。查看一張表的索引屬性,可以在查詢分析器中使用以下命令:select * from sysindexes where id=object_id(『tablename』) ;而要查看錶的索引所佔空間的大小,可以使用系統存儲過程命令:sp_spaceused tablename,其中參數tablename為被索引的表名。
Ⅲ 資料庫的索引問題
第一次回答:
第一次運行很慢,跟沒有索引一樣,之後每次運行都很快
「第一次」是指每次運行程序第一次查詢(第二次查詢很快,但是關閉程序再開,第一次查詢又很慢)還是第一次運行程序查詢很慢但關閉程序再開都很快?
第二次回答:
在創建復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜索或僅對前幾列執行搜索時,復合索引非常有用;僅對後面的任意列執行搜索時,復合索引則沒有用處。
如果您很可能僅對一個列多次執行搜索,則該列應該是復合索引中的第一列。如果您很可能對一個兩列索引中的兩個列執行單獨的搜索,則應該創建另一個僅包含第二列的索引。
包含多個列的主鍵始終會自動以復合索引的形式創建索引,其列的順序是它們在表定義中出現的順序,而不是在主鍵定義中指定的順序。您應該考慮將通過主鍵來執行的搜索,以確定哪一列應該排在最前面。在後面的任何被頻繁搜索的主鍵列上,應該考慮添加額外的索引。
例如,假設您在兩個列上創建一個復合索引。一個列包含雇員的名字,另一個列包含雇員的姓氏。您可以創建一個先包含名字後包含姓氏的索引。或者,您也可以創建一個先包含姓氏後包含名字的索引。雖然這兩個索引以兩個列組織信息,但它們具有不同的功能。
CREATE INDEX fname_lname
ON employee emp_fname, emp_lname;
CREATE INDEX lname_fname
ON employee emp_lname, emp_fname;假設您需要搜索名字 John。唯一有用的索引是在索引的第一列包含名字的索引。由於名字為 John 的雇員會出現在索引中的任意位置,因此先按姓氏再按名字組織的索引沒有用處。
如果您認為很可能需要僅按名字或僅按姓氏查找雇員,則應該創建這兩個索引。
或者,您也可以創建兩個索引,一個索引僅包含一個列。但是,請注意,Adaptive Server Anywhere 在處理單個查詢時只使用一個索引來對任何一個表進行訪問。即使您知道名字和姓氏,Adaptive Server Anywhere 也可能需要讀取額外的行,以查找包含正確姓氏的行。
當您使用 CREATE INDEX 命令創建索引時(如上例所示),列會按命令中所示的順序創建。
復合索引和 ORDER BY
預設情況下,索引的列按升序排列,但您可以選擇通過在 CREATE INDEX 語句中指定 DESC 來將這些列按降序排列。
只要 ORDER BY 子句僅包含索引中的列,Adaptive Server Anywhere 就可以選擇使用索引來優化 ORDER BY 查詢。此外,索引列的排序方式必須與 ORDER BY 子句完全相同或完全相反。對於單列索引,這種排序方式始終會使查詢可以得到優化,但復合索引則需要稍微多考慮一些問題。
Ⅳ oracle中索引的性能怎麼測試,可以用什麼來測試嗎
在sqlplus中 登陸
create index inx_test on tableName(columName);
set timing on --開啟執行時間顯示
在你的實驗表中差上幾十萬的數據
然後select * from tableName where columName=xxx;注意columnName必須回是你建答索引的列,否則就無意義了。--這句是引用索引的,查詢後看時間。
然後 select /*full(a)*/ * from tableName a where columnName=xxx; 跟上面的查詢條件要一致。這句就是HINT,強行不使用索引。看一下時間。
得出結論:索引加快了查詢的速度。
再多建幾個列的索引。繼續試驗
得出結論:索引越多不一定會越快。
Ⅳ 資料庫索引原理
資料庫索引原理如下:
使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找人員,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。
索引的實現通常使用B樹及其變種B+樹。在數據之外,資料庫系統還維護著滿足特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找演算法。
(5)測試索引用資料庫擴展閱讀:
對於有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:
1、查詢很少:
對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
2、少數據值:
對於那些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。
3、定義類型:
對於那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。
Ⅵ 資料庫索引的操作案例
最普通的情況,是為出現在where子句的欄位建一個索引。為方便講述,先建立一個如下的表。
CREATE TABLE mytable(
idserial primary key,
category_id int not null default0,
user_id int not null default0,
adddate int not null default0
);
如果在查詢時常用類似以下的語句:
SELECT * FROM mytable WHERE category_id=1;
最直接的應對之道,是為category_id建立一個簡單的索引:
CREATE INDEX mytable_categoryid ON mytable (category_id);
OK.如果有不止一個選擇條件呢?例如:
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
第一反應可能是,再給user_id建立一個索引。不好,這不是一個最佳的方法。可以建立多重的索引。
CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);
注意到在命名時的習慣了嗎?使用表名_欄位1名_欄位2名的方式。很快就會知道為什麼這樣做了。
現在已經為適當的欄位建立了索引,不過,還是有點不放心吧,可能會問,資料庫會真正用到這些索引嗎?測試一下就OK,對於大多數的資料庫來說,這是很容易的,只要使用EXPLAIN命令:
EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2;
This is what Postgres 7.1 returns (exactlyasI expected)
NOTICE:QUERY PLAN:
Index Scan using mytable_categoryid_userid on
mytable(cost=0.00..2.02 rows=1 width=16)
EXPLAIN
以上是postgres的數據,可以看到該資料庫在查詢的時候使用了一個索引(一個好開始),而且它使用的是創建的第二個索引。看到上面命名的好處了吧,馬上知道它使用適當的索引了。
接著,來個稍微復雜一點的,如果有個ORDERBY 子句呢?不管你信不信,大多數的資料庫在使用orderby的時候,都將會從索引中受益。
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
很簡單,就像為where子句中的欄位建立一個索引一樣,也為ORDER BY的子句中的欄位建立一個索引:
CREATE INDEX mytable_categoryid_userid_adddate ON mytable (category_id,user_id,adddate);
注意:mytable_categoryid_userid_adddate將會被截短為mytable_categoryid_userid_addda
CREATE
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
NOTICE:QUERY PLAN:
Sort(cost=2.03..2.03 rows=1 width=16)
->Index Scanusing mytable_categoryid_userid_addda
on mytable(cost=0.00..2.02 rows=1 width=16)
EXPLAIN
看看EXPLAIN的輸出,資料庫多做了一個沒有要求的排序,這下知道性能如何受損了吧,看來對於資料庫的自身運作是有點過於樂觀了,那麼,給資料庫多一點提示吧。
為了跳過排序這一步,並不需要其它另外的索引,只要將查詢語句稍微改一下。這里用的是postgres,將給該資料庫一個額外的提示--在ORDER BY語句中,加入where語句中的欄位。這只是一個技術上的處理,並不是必須的,因為實際上在另外兩個欄位上,並不會有任何的排序操作,不過如果加入,postgres將會知道哪些是它應該做的。
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY category_id DESC,user_id DESC,adddate DESC;
NOTICE:QUERY PLAN:
Index Scan Backward using
mytable_categoryid_userid_addda on mytable(cost=0.00..2.02 rows=1 width=16)
EXPLAIN
現在使用料想的索引了,而且它還挺聰明,知道可以從索引後面開始讀,從而避免了任何的排序。
以上說得細了一點,不過如果資料庫非常巨大,並且每日的頁面請求達上百萬算,想會獲益良多的。不過,如果要做更為復雜的查詢呢,例如將多張表結合起來查詢,特別是where限制字句中的欄位是來自不止一個表格時,應該怎樣處理呢?通常都盡量避免這種做法,因為這樣資料庫要將各個表中的東西都結合起來,然後再排除那些不合適的行,搞不好開銷會很大。
如果不能避免,應該查看每張要結合起來的表,並且使用以上的策略來建立索引,然後再用EXPLAIN命令驗證一下是否使用了料想中的索引。如果是的話,就OK。不是的話,可能要建立臨時的表來將他們結合在一起,並且使用適當的索引。
要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
以上介紹的只是一些十分基本的東西,其實裡面的學問也不少,單憑EXPLAIN是不能判定該方法是否就是最優化的,每個資料庫都有自己的一些優化器,雖然可能還不太完善,但是它們都會在查詢時對比過哪種方式較快,在某些情況下,建立索引的話也未必會快,例如索引放在一個不連續的存儲空間時,這會增加讀磁碟的負擔,因此,哪個是最優,應該通過實際的使用環境來檢驗。
在剛開始的時候,如果表不大,沒有必要作索引,意見是在需要的時候才作索引,也可用一些命令來優化表,例如MySQL可用OPTIMIZETABLE。
Ⅶ 資料庫索引是什麼,有什麼用,怎麼用
1、資料庫索引是什麼,有什麼用
資料庫索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。
索引的一個主要目的就是加快檢索表中數據的方法,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。
2、資料庫索引的用法
當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作;
第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識值的數據頁的邏輯指針清單。
(7)測試索引用資料庫擴展閱讀:
一、索引的原理:
對要查詢的欄位建立索引其實就是把該欄位按照一定的方式排序;建立的索引只對該欄位有用,如果查詢的欄位改變,那麼這個索引也就無效了,比如圖書館的書是按照書名的第一個字母排序的,那麼你想要找作者叫張三的就不能用改索引了;還有就是如果索引太多會降低查詢的速度。
二、資料庫索引的特點:
1、避免進行資料庫全表的掃描,大多數情況,只需要掃描較少的索引頁和數據頁,而不是查詢所有數據頁。而且對於非聚集索引,有時不需要訪問數據頁即可得到數據。
2、聚集索引可以避免數據插入操作,集中於表的最後一個數據頁面。
3、在某些情況下,索引可以避免排序操作。