1. 程式人生 > >關於mysql建立索引 復合索引 索引類型

關於mysql建立索引 復合索引 索引類型

uniq 復合索引 最優 強烈 pri 查詢 abc pac 數據存儲

這兩天有個非常強烈的感覺就是自己在一些特別的情況下還是hold不住,腦子easy放空或者說一下子不知道怎麽去分析問題了,比方,問“hash和btree索引的差別”,這非常難嗎。僅僅要掌握了這兩種數據結構稍加分析就能得出答案,結果是一下子不知道從何說起。進入正題吧。這兩者有啥差別。

1. hash索引查找數據基本上能一次定位數據。當然有大量碰撞的話性能也會下降。

而btree索引就得在節點上挨著查找了,非常明顯在數據精確查找方面hash索引的效率是要高於btree的。

2. 那麽不精確查找呢,也非常明顯,由於hash算法是基於等值計算的。所以對於“like”等範圍查找hash索引無效,不支持;

3. 對於btree支持的聯合索引的最優前綴。hash也是無法支持的。聯合索引中的字段要麽全用要麽全不用。提起最優前綴竟然都泛起迷糊了,看來有時候放空得太厲害。

4. hash不支持索引排序。索引值和計算出來的hash值大小並不一定一致。

勤動腦,少放空。







索引是在數據庫表或者視圖上創建的對象,目的是為了加快對表或視圖的查詢的速度。

依照存儲方式分為:聚集與非聚集索引
依照維護與管理索引角度分為:唯一索引、復合索引和系統自己主動創建的索引。

索引的結構是由:根節點--->非葉節點--->非葉節點--->葉節點

1、聚集索引:表中存儲的數據依照索引的順序存儲,檢索效率比普通索引高,但對數據新增/改動/刪除的影響比較大。

邏輯順序決定了表中對應行的物理順序


特點:
  (1) 一個表能夠最多能夠創建249個索引
  (2) 先建聚集索引才幹創建非聚集索引
(3) 非聚集索引數據與索引不同序
(4) 數據與索引在不同位置
(5) 索引在葉節點上存儲,在葉節點上有一個"指針"直接指向要查詢的數據區域
(6) 數據不會依據索引鍵的順序又一次排列數據

(7)假設在該字段上進行範圍查詢,或者該表非常少做增刪改

 創建聚集索引的語法:
create NONCLUSTERED INDEX idximpID ON EMP(empID)
2、非聚集索引

:不影響表中的數據存儲順序,檢索效率比聚集索引低,對數據新增/改動/刪除的影響非常少

是通過二叉樹的數據結構來描寫敘述的,邏輯順序,特點:
(1) 無索引。數據無序
(2) 有索引。數據與索引同序
(3) 數據會依據索引鍵的順序又一次排列數據
(4) 一個表僅僅能有一個索引
(5) 葉節點的指針指向的數據也在同一位置存儲
語法:
create CLUSTERED INDEX idxempID on emp(empID)
3、惟一索引:惟一索引能夠確保索引列不包括反復的值.
能夠用多個列,可是索引能夠確保索引列中每一個值組合都是唯一的
姓 名
李 二
張 三
王 五
語法: create unique index idxempid on emp(姓,名)

4、復合索引:假設在兩上以上的列上創建一個索引,則稱為復合索引。
那麽。不可能有兩行的姓和名是反復的
語法:
create index indxfullname on addressbook(firstname,lastname)

註意:假設把復合的聚集索引字段分開查詢。
帶著這個問題。我們來看一下下面的查詢速度(結果集都是25萬條數據):(日期列fariqi首先排在復合聚集索引的起始列。usernameneibuyonghu排在後列):
(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>‘‘2004-5-5‘‘
查詢速度:2513毫秒
(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>‘‘2004-5-5‘‘ and neibuyonghu=‘‘辦公室‘‘
查詢速度:2516毫秒
(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=‘‘辦公室‘‘
查詢速度:60280毫秒
 從以上試驗中,我們能夠看到假設僅用聚集索引的起始列作為查詢條件和同一時候用到復合聚集索引的所有列的查詢速度是差點兒一樣的。甚至比用上所有的復合索引列還要略快(在查詢結果集數目一樣的情況下);而假設僅用復合聚集索引的非起始列作為查詢條件的話,這個索引是不起不論什麽作用的。當然,語句1、2的查詢速度一樣是由於查詢的條目數一樣。假設復合索引的所有列都用上,並且查詢結果少的話,這樣就會形成“索引覆蓋”。因而性能能夠達到最優。同一時候,請記住:不管您是否常常使用聚合索引的其它列,但其前導列一定要是使用最頻繁的列。

5、系統自建的索引:在使用T_sql語句創建表的時候使用PRIMARY KEY或UNIQUE約束時。會在表上自己主動創建一個惟一索引
自己主動創建的索引是無法刪除的
語法:
create table ABc
( empID int primary key,
firstname varchar(50)UNIQUE,
lastname varchar(50)UNIQUE,
)
這種結果就出來了三個索引,但僅僅有一個聚集索引哦


6、創建索引的方法:
1、企業管理器中
(1)右擊某個表,全部任務---管理索引,打開管理索引。單擊“新建”就能夠創建索引
(2)在設計表中進行設計表,管理索引/鍵
(3)在關系圖中,加入表後右擊關系圖中的某個表,就有“索引/鍵”
(4)通過向導,數據庫---創建索引向導
(5)通過T-SQL語句
2、能過“索引優化向導”來優化索引的向導。通過它能夠決定選擇哪些列做為索引列
 
二、何時使用聚集索引或非聚集索引

以下的表總結了何時使用聚集索引或非聚集索引(非常重要):

動作描寫敘述 使用聚集索引 使用非聚集索引
列常常被分組排序
返回某範圍內的數據 不應
一個或極少不同值 不應 不應
小數目的不同值 不應
大數目的不同值 不應
頻繁更新的列 不應
外鍵列
主鍵列
頻繁改動索引列 不應

關於mysql建立索引 復合索引 索引類型