具體緣由:java
sql的執行順序:
手寫sql
機器執行
mysql
七種join
sql
簡單來講,索引是一種數據結構 其目的在於提升查詢效率 能夠簡單理解爲「排好序的快速查找結構」數據庫
通常來講,索引自己也很大,不可能所有存儲在內存中,所以索引每每以索引文件的形式存儲在中磁盤上
咱們通常所說的索引,若是沒有特殊說明的話,就是指B+樹結構組織的索引。其中彙集索引,次要索引,覆蓋索引,複合索引,前綴索引,惟一索引默認都是使用B+樹索引。 通常java開發知道這些基本夠用了服務器
相似大學圖書館建數目索引,提升數據檢索效率,下降數據庫的io成本
經過索引對數據進行排序,下降數據排序成本,下降了cpu的數據結構
索引實際上也是一張表,保存了主鍵和索引字段,並指向實體表的記錄,因此索引列也要空間併發
雖然索引大大提升了查詢速度,可是會下降更新表的速度,如對錶進行insert,update和delete。由於更新表時,mysql不只要保存數據,還要保存一下索引文件每次添加了索引列的字段高併發
索引只是提升效率的一個因素,若是你的mysql有大數據量的表,就須要花時間研究創建最優秀的索引,或優化查詢語句。性能
單值索引
惟一索引
複合索引mysql索引
show index from TableName;(查看錶的索引)
eg:show index from city;
create [unique] index indexname(索引名稱) on TableName(字段名);
eg:create index idx_city_name on city(cname);
eg:create index idx_city_idnamepid on city(id,name,pid);
drop index indexname on TableName;
eg:drop index idx_city_name on city;
使用ALERT命令
ALERT TABLE tbl_name ADD PRIMARY KEY(column_list);該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲null;
ALERT TABLE tbl_name ADD UNIQUE index_name(column_list);這條語句建立索引的值必須是惟一的(除了null外,null可能會出現屢次)
ALERT TABLE tbl_name ADD INDEX index_name(colmun_list);添加普通索引,索引值可出現屢次
ALERT TABLE tbl_name ADD FULLTEXT index_name(column_list);該語句指定了索引爲FULLTEXt,用於全文索引
BTree索引
Hash索引
full-text索引
R-Tree索引
a.主鍵自動創建惟一索引
b.頻繁做爲查詢條件的字段應該建立索引
c.查詢中與其它表關聯的字段,外鍵關係創建索引
d.頻繁更新的字段不適合創建索引(由於每次更新不單單是更新數據還要更新索引,加劇io負擔)
e.where條件裏用不到的字段不建立索引
f.單鍵/組合索引的選擇問題(在高併發下傾向建立組合索引)
g.查詢中排序的字段,排序字段若經過索引去訪問將大大提升排序速度
h.查詢中統計或分組的字段
a.表記錄太少b.常常增刪改查的表(讀少寫多)c.數據重複且分佈平均的表字段,所以應該只爲最常常查詢和最常常排序的數據列創建索引,注意,若是某個數據列包含許多重複內容,爲它創建索引就沒有太大的實際效果