索引設計的原則
索引(index)是幫助mysql高效獲取資料的資料結構(有序)。在資料之外,資料庫系統還維護者滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引
優勢:
1類似於書籍的目錄索引,提高資料檢索效率,降低資料庫io成本
2通過索引對資料進行排序,降低資料排序成本,降低cpu的消耗
劣勢:
1索引也是一種表,儲存了索引與索引字段,並指向實體類,索引也會占用空間
2索引提高了資料建索的效率,但也大大降低了資料更新的效率,資料更新時mysql
不僅要儲存更新資料,還要儲存更新的索引
單值索引:乙個索引只包含單個列欄位,乙個表可以有多個單值索引
唯一索引:索引的列的值必須唯一,可以為null
復合索引:即乙個索引包含多個列
索引在建表時可以建立,也可以隨時增加(開發中直接通過客戶端工具建立了,很少使用到命令)
create
[unique
|fulltext|spatial]
index index_name [useing index_type]
on table_name(index_col_name,..
.)例: create
index index_city_name on city(city_name)
;
show
index
from table_name;
drop
index index_name on table_name;
例子:drop
index index_city_name on city;
1.
alter
table tb_name add
primary
key(column_list)
;新增乙個主鍵,這意味著索引值必須是唯一的,且不能為空
2.alter
table tb_name add
unique index_name(column_list)
;新增乙個唯一索引,值只出現一次 null除外
3.alter
table tb_name add
index index_name(column_list)
;新增普通索引,值可以出現多次
4.alter
table tb_name add fulltext index_name(colum_list)
;該語句新增索引為 fulltext 用於全文索引
1.對查詢頻次較高,且資料量較大的資料表建立索引
2.索引欄位的選擇,最佳候選列應當從where子句的條件中提取,如果where子句中的組合比較多,那麼應當挑選最常用,過濾效果最好的列的組合
3.使用唯一索引,區分度越高,使用索引的效率越高
4.索引可以大大提高資料檢索效率,但是索引不是多多益善,索引越多,維護索引的代價也就會越高.對於插入 更新 刪除 等dml操作比較頻繁的表來說,索引越多dml操作效率越低
5.使用短索引,索引建立以後也是使用磁碟儲存的,因此提高索引的io效率,也可以提高總體的訪問效率.假如構成索引的總長度比較短,那麼在給定大小的儲存塊內就會儲存更多的索引值,相應的可以提公升索引的io效率
6.利用最左字首,n個列組成的組合索引,相當於建立了多個索引,如果查詢時where子句中使用了組成該索引的前幾個字段,那麼這條sql可以用組合索引來提公升查詢效率
總結:查詢頻率高的字段建立索引,從where子句中提取字段建立索引,使用唯一索引,使用短索引,利用最左字首
create
index index_name on table_name (fileds...
.)
1.全值匹配,對索引中所有的列都指定具體的值
2.最左字首法則
如果建立組合索引,查詢從組合索引的最左列開始,並且不跳過索引中的列,違背最左字首法則索引失效
3.範圍查詢,最右邊的列不能使用索引
4.不要在索引的列上使用運算
5.字串不要單引號,索引失效
6.盡量使用覆蓋索引,不使用select *
查詢的列盡量包含索引,如果查詢的列不包含索引 也會降低索引的效能
7.用or分割開的條件,如果or前面的條件用了索引,後面的條件沒有索引,那麼整條sql都不會使用索引
8.模糊查詢 %在前面 索引失效 %在後面 索引有效,對於模糊查詢索引失效的情況 可以用全覆蓋索引解決
9.如果mysql評估使用全表查詢比使用索引快,則不會使用索引.主要取決於資料量
10.in走索引,not in不走索引
11.盡量使用復合索引,少使用單列索引
復合索引相當於建立了多個索引,單個索引資料庫會選擇辨識度最高的字段的索引而不會使用全部的索引
show
status
like
'handler_read%'
;show
global
status
like
'handler_read%'
;
字段解析
1.handler_read_first:(這個值越低越好) 索引中第一條被讀的次數,如果較高,表示伺服器正進行大量全域性索引
2.handler_read_key:(這個值越高越好) 如果索引正在工作,這個值代表乙個欄位被索引值讀的次數,如果值越低,表示索引得到的效能改善不高,因為索引不經常使用(這個值越高越好)
3.handler_read_next :按照鍵順序讀下一行的請求數。如果你用範圍約束或如果執行索引掃瞄來查詢索引列, 該值增加。
4.handler_read_prev:按照鍵順序讀前一行的請求數。該讀方法主要用於優化order by … desc
5.handler_read_rnd :(這個值較高需要建立索引補救)根據固定位置讀一行的請求數。如果你正執行大量查詢並需要對結果進行排序該值較高。 你可能使用了大量需要mysql掃瞄整個表的查詢或你的連線沒有正確使用鍵。這個值較高,意味著執行效率低,應該建立索引來補救。
6.handler_read_rnd_next:(這值較高,索引不正確或查詢沒有用到索引)在資料檔案中讀下一行的請求數。如果你正進行大量的表掃瞄,該值較高。通常說 明你的表索引不正確或寫入的查詢沒有利用索引。
MYSQL優化 索引(一)
對於mysql的優化的各種方式中,索引方式佔很大比例。當資料很大時,才會感受到索引的魅力。為了方便學習和工作中使用,收集實驗整理下的。我們知道,查詢資料時,先把資料從磁碟塊中讀取到記憶體中,再做處理的。如果沒有索引時,就會容易全表查詢。而io操作又是最耗時的。比如 1 100放入磁碟快1中,101 ...
MySQL索引優化 一
案例 1 首先建立乙個article表 往其中插入三條資料 2 查詢category id為1且comments大於1的情況下,views最多的article id select id,author id from article where category id 1and comments 1o...
Mysql索引使用 索引優化(二)
一 什麼情況下適合使用索引?欄位的數值有唯一性的限制,比如使用者名稱,可以用唯一索引或者主鍵索引 頻繁作為 where 查詢條件的字段,尤其在資料表大的情況下 需要經常 group by 和 order by 的列 索引就是讓資料按照某種順序進行儲存或檢索,因此當我們使用 group by 對資料進...