一、索引基礎
索引類型:
? ? ?1、普通索引: 創建到任何數據類型中 ? ? ? ?
? ? ?2、唯一性索引:限制索引值必須唯一
? ? ?3、全文索引:只能創建到char、varchar、text類型字段上,主要用于提高文本查詢速度。myisam引擎支持。
? ? ?4、單列索引:給表中單個字段創建索引
? ? ?5、多列索引:給多個字段創建索引
? ? ?6、空間索引:使用spatial參數創建,提供系統獲取控件數據的效率
索引的基本操作:
CREATE?TABLE?t_user1(id?INT?, ?????????????????????userName?VARCHAR(20), ?????????????????????PASSWORD?VARCHAR(20), ?????????????????????INDEX?(userName)?? ?????????????); ????????????? CREATE?TABLE?t_user2(id?INT?, ?????????????????????userName?VARCHAR(20), ?????????????????????PASSWORD?VARCHAR(20), ?????????????????????UNIQUE?INDEX?index_userName(userName) ?????????????); ??????????? CREATE?TABLE?t_user3(id?INT?, ?????????????????????userName?VARCHAR(20), ?????????????????????PASSWORD?VARCHAR(20), ?????????????????????INDEX?index_userName_password(userName,PASSWORD)//多列索引 ?????????????); ????????????? CREATE??INDEX?index_userName?ON?t_user4(userName);--對已經創建的表指定索引 CREATE??UNIQUE?INDEX?index_userName?ON?t_user4(userName); CREATE??INDEX?index_userName_password?ON?t_user4(userName,PASSWORD); ALTER?TABLE?t_user5?ADD?INDEX?index_userName(userName);--修改索引 ALTER?TABLE?t_user5?ADD?UNIQUE?INDEX?index_userName(userName); ALTER?TABLE?t_user5?ADD?INDEX?index_userName_password(userName,PASSWORD); DROP?INDEX?index_userName?ON?t_user5; DROP?INDEX?index_userName_password?ON?t_user5;
? ? ?添加索引可以加速查詢效率,避免全表數據查詢,取而代之的是通過查找索引再找到目的數據。select t.name from user t where t.id=5 ,如果在actor_id列創建索引,則mysql使用該索引找到id=5的行,也就是說先在索引上按值進行查找,然后返回所有包含該值的數據行。
? ? ?索引可以包含一個或多列,如果索引包含多個列,那列的順序也非常重要,因為mysql只能高效的使用索引的最左前綴列。并且索引的創建和維護也需要占用系統資源,這就涉及到如何創建高效的索引提高查詢效率。
二、mysql的索引類型
? ? ?一般來說,數據索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對于內存存取,所以索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數。這就要求一個優質的數據結構整理、存儲數據庫索引。
? ? ?一般索引類型均是利用了數據結構算法,例如B-Tree既是mysql中索引類型,也是動態查找樹:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balanced Binary Search Tree),紅黑樹(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)的二叉樹結構。
? ? ?由于MySQL這些索引類型都是基于數據結構算法的實現,一般開發開始在基礎之上應用。根據不同的數據結構創建的索引,應用也有所不同。
三、索引使用常見誤區 ?
1、獨立列索引
? ? ?錯誤使用:select t.name from user t where t.age+1=5 ,對于這個條件age+1=5 ,mysql無法自動解析,即便對age列創建了索引,但mysql在查詢時也不會使用索引查詢,依舊全表掃描。
? ? ?錯誤使用:select t.name ?from user t where TO_DAYS(`CURRENT_DATE`())-TO_DAYS(date_col)? ? ?正確原則:始終將索引列放到比較符的單獨一邊。
2、多列索引
? ? ?常見錯誤:沒列創建獨立的索引,或者按照錯誤的順序創建多列索引,或者索性直接把where條件中的列都建立索引。
? ? ?正確使用:針對不同的索引類型選擇合適的索引順序
? ? ?例如select t.name from user t where t.staffId=2 and custom_id=7;
應對上面的查詢,是應該創建一個(staffId,custom_id)還是顛倒一下這兩列順序。
以B-Tree為例,索引列的順序意味著索引首先會按照最左列進行排序,從左到右。一般都將篩選條件頻率最高的字段放在索引最前是明智的。這樣設計的索引能夠最快的過濾出需要的行。
四、總結
? ? ?查看之前做的一個java云平臺項目,使用的ORM框架,當時項目出現級聯查詢緩慢,故結合了JDBC+ORM組合形式編程,現在查看幾個數據庫的表設計,對于索引優化這塊還需要再應用,一般創建的索引都僅使用了單列索引,使用主鍵創建;這樣做沒什么大問題,但如果出現了查詢耗時問題時,表結構優化、索引優化、查詢優化就需要齊頭并進,但依靠ORM框架重新選型或再優化,是無法解決問題的。
?以上就是MySQL數據庫優化(四)——MySQL索引優化?的內容,更多相關內容請關注PHP中文網(www.php.cn)!