程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 關於mysql建立索引復合索引索引類型

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

編輯:MySQL綜合教程

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


這兩天有個很強烈的感覺就是自己在一些特別的情況下還是hold不住,腦子容易放空或者說一下子不知道怎麼去分析問題了,比如,問“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首先排在復合聚集索引的起始列,用戶名neibuyonghu排在後列):
(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、能過“索引優化向導”來優化索引的向導,通過它可以決定選擇哪些列做為索引列
 
二、何時使用聚集索引或非聚集索引

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved