數據查詢優化之mysql索引
為什麽要建立索引:
索引用於快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然後讀完整個表直到找出相關的行,還需要考慮每次讀入數據頁的IO開銷。而如果采取索引,則可以根據索引指向的頁以及記錄在頁中的位置,迅速地讀取目標頁進而獲取目標記錄。
使用索引需要註意:
⑴只對WHERE和ORDER BY需要查詢的字段設置索引,避免無意義的硬盤開銷;
⑵組合索引支持前綴索引;
⑶更新表的時候,如增刪記錄,MySQL會自動更新索引,保持樹的平衡;因此更多的索引意味著更多的維護成本
索引的字段類型問題
- text類型,也可建索引(需指定長度)
- myisam存儲引擎索引鍵長度綜合不能超過1000字節
- 用來篩選的值盡量保持和索引列同樣的數據類型
索引分四類:
index ----普通的索引,數據可以重復
fulltext----全文索引,用來對大表的文本域(char,varchar,text)進行索引。語法和普通索引一樣。
unique ----唯一索引,唯一索引,要求所有記錄都唯一
primary key ----主鍵索引,也就是在唯一索引的基礎上相應的列必須為主鍵
like 不能用索引?
- 盡量減少like,但不是絕對不可用,”xxxx%” 是可以用到索引的,
想象一下,你在看一本成語詞典,目錄是按成語拼音順序建立,查詢需求是,你想找以 “一”字開頭的成語(”一%“),和你想找包含一字的成語(“%一%”)
- 除了like,以下操作符也可用到索引:
<,<=,=,>,>=,BETWEEN,IN
<>,not in ,!=則不行
原則
- 單表數據太少,索引反而會影響速度;更新非常頻繁的數據不適宜建索引
- where後的條件,order by ,group by 等這樣過濾時,後面的字段最好加上索引。根據實際情況,選擇PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要適度
- 聯合查詢,子查詢等多表操作時關連字段要加索引
ps:數據量特別大的時候,最好不要用聯合查詢,即使你做了索引(??)
索引原則1.索引越少越好
原因:主要在修改數據時,第個索引都要進行更新,降低寫速度。
2.最窄的字段放在鍵的左邊
3.避免file sort排序,臨時表和表掃描.
哪些常見情況不能用索引?
- like “%xxx”
- not in , !=
- 對列進行函數運算的情況(如 where md5(password) = “xxxx”)
- WHERE index=1 OR A=10
- 存了數值的字符串類型字段(如手機號),查詢時記得不要丟掉值的引號,否則無法用到該字段相關索引,反之則沒關系
覆蓋索引(Covering Indexes)擁有更高效率
索引包含了所需的全部值的話,就只select 他們,換言之,只select 需要用到的字段,如無必要,可盡量避免select *
NULL 的問題
NULL會導致索引形同虛設,所以在設計表結構時應避免NULL 的存在(用其他方式表達你想表達的NULL,比如 -1?)
如何查看索引信息,如何分析是否正確用到索引?
show index from tablename;
explain select ……;
數據查詢優化之mysql索引