使用MYSQL索引

2021-04-17 07:36:25 字數 2180 閱讀 4195

關聯式資料庫的世界是乙個表與集合、表與集合上的運算佔統治地位的世界。資料庫是乙個表的集合,而表又是行和列的集合。在發布一條select 查詢從表中進行檢索行時,得到另乙個行和列的集合。這些都是一些抽象的概念,對於資料庫系統用來操縱表中資料的基本

表示沒有多少參考價值。另乙個抽象概念是,表上的運算都同時進行;查詢是一種概念性的集合運算,並且集合論中沒有時間概念。當然,現實世界是相當不同的。資料庫管理系統實現了抽象的概念,但是在實際的硬體

範圍內要受到實際的物理約束。結牽檠ㄊ奔洌惺幣㪨鶼ᕦ?唦??雦�?단?풥䴥?㍥??圥�?㭨?␥?ன?ݮ篤???臢??????⦄??䧬릾?????ि親இꥧ榤?p以說氖牽屑鋼旨鈾僭慫愕募際醯啥員斫興饕故菘夥衿韃檎倚懈臁?煽悸竊躚浞擲謎廡┧饕幢嘈床檠?殺嘈從跋旆衿韉鞫然頻牟檠估醋遠喔隹突?섧韋꠮腮吩?嶮??␦???ꢥ????녨ﵦ࡮㭥?????갦????ⓩ?鉥합?ꙮ飦爧?⑥熦䒄ῢr>     這些正是本章所要討論的問題,其目標是優化資料庫系統的效能,使其盡可能快地處理各種查詢。mysql已經相當快了,但即使是最快的資料庫,在人的設計下還能執行得更快。

4.1使用索引

索引表的方法相符。表的資料行儲存在資料檔案中,而索引值儲存在索引檔案中。乙個表上可有不止乙個索引;如果確實有不止乙個索引,它們都儲存在同乙個索引檔案中。索引檔案中的每個索引由排過序的用來快速訪問資料檔案的鍵記錄陣列構成。

前面的討論描述了單錶查詢中索引的好處,其中使用索引消除了全表掃瞄,極大地加快了搜尋的速度。在執行涉及多個表的連線查詢時,索引甚至會更有價值。在單個表的查詢中,每列需要檢視的值的數目就是表中行的數目。而在多個表的查詢中,可能的組合數目極大,因為這個數目為各表中行數之積。

假如有三個未索引的表t 1、t 2、t 3,分別只包含列c 1、c 2、c 3,每個表分別由含有數值1到1000 的1000 行組成。查詢對應值相等的錶行組合的查詢如下所示:

select c1,c2,c3

from t1,t2,t3

where c1=c2 and c1=c3

此查詢的結果應該為1000 行,每個組合包含3 個相等的值。如果我們在無索引的情況下處理此查詢,則不可能知道哪些行包含那些值。因此,必須尋找出所有組合以便得出與where 子句相配的那些組合。可能的組合數目為10 0 0㗱0 0 0㗱0 0 0(十億),比匹配數目多一百萬倍。很多任務作都浪費了,並且這個查詢將會非常慢,即使在如像mysql這樣快的資料庫中執行也會很慢。而這還是每個表中只有1000 行的情形。如果每個表中有一百萬行時,將會怎樣?很顯然,這樣將會產生效能極為低下的結果。如果對每個表進行索引,就能極大地加速查詢程序,因為利用索引的查詢處理如下:

1) 如下從表t1中選擇第一行,檢視此行所包含的值。

2) 使用表t2 上的索引,直接跳到t2 中與來自t1的值匹配的行。類似,利用表t3 上的索引,直接跳到t3 中與來自t1的值匹配的行。

3) 進到表t1的下一行並重複前面的過程直到t1中所有的行已經查過。在此情形下,我們仍然對錶t1執行了乙個完全掃瞄,但能夠在表t2 和t3 上進行索引查詢直接取出這些表中的行。從道理上說,這時的查詢比未用索引時要快一百萬倍。如上所述,mysql利用索引加速了where 子句中與條件相配的行的搜尋,或者說在執行連線時加快了與其他表中的行匹配的行的搜尋。它也利用索引來改進其他操作的效能:

■ 在使用min( ) 和max( ) 函式時,能夠快速找到索引列的最小或最大值。

■ mysql常常能夠利用索引來完成order by 子句的排序操作。

■ 有時,mysql可避免對整個資料檔案的讀取。假如從乙個索引數值列中選擇值,而且不選擇表中其他列。這時,通過對索引值的讀取,就已經得到了讀取資料檔案所要得到的值。沒有對相同的值進行兩次讀取的必要,因此,甚至無需涉及資料檔案。

4.1.2 索引的弊端

一般情況下,如果mysql能夠知道怎樣用索引來更快地處理查詢,它就會這樣做。這表示,在大多數情況下,如果您不對錶進行索引,則損害的是您自己的利益。可以看出,作者描繪了索引的諸多好處。但有不利之處嗎?是的,有。實際上,這些缺點被優點所掩蓋了,

但應該對它們有所了解。

首先,索引檔案要佔磁碟空間。如果有大量的索引,索引檔案可能會比資料檔案更快地達到最大的檔案尺寸。其次,索引檔案加快了檢索,但增加了插入和刪除,以及更新索引列中的值的時間(即,降低了大多數涉及寫入的操作的時間),因為寫操作不僅涉及資料行,而且還常常涉及索引。乙個表擁有的索引越多,則寫操作的平均效能下降就越大。在4 . 4節「有效地裝載資料」中,我們將更為詳細地介紹這些效能問題,並討論怎樣解決。

4.1.3 選擇索引

MySQL索引使用

單列索引 乙個索引只包含單個列,乙個表可以有多個單列索引 組合索引 乙個索引包含多個列 索引名 自己可以隨便取 表名 表的名字 表列 表裡面的列,即需要索引的列 length 可以隨意填寫 create index 索引名 on 表名 表列 length alter table 表名 add ind...

MySQL索引使用

1.索引概念 在資料庫中查詢以萬計的記錄時,查詢效率會變得十分低下,為什麼呢,因為資料庫查詢要一行一行對所有字段進行對比,這樣時間複雜度就會很龐大,所以,為了降低時間複雜度,提高執行效率,引入索引對查詢進行優化 索引就是乙個指向一張表中一列或多列值的指標,在建立索引後,會先在索引中查詢給定的值,如果...

mysql欄位簡索引 MySQL中索引使用簡例

一張表最多不超過4個索引 某個欄位的值離散度越高,該字段越適合做索引的關鍵字。占用儲存空間少的字段更適合選做索引的關鍵字。較頻繁的作為where查詢條件的字段應該建立索引,分組字段或者排序字段應該建立索引,兩個表的連線字段應該建立索引。更新頻繁的字段不適合做索引,不會出現在where中的字段不應該建...