開講前且看下文:
作爲一箇中國人,字典大家應該都認識,下至6歲學童,上至80老爺爺老奶奶都會用。現在,給你一本字典,
再給你一個漢字,你能不能知道這個漢字的具體意思?組詞?相信大家都能做到。使用字典步驟大概如下:
1:找讀音或者偏旁部首。
2:根據讀音和偏旁提示的頁碼 快速定位到這個漢字
試想,如果字典沒有目錄,讓大家找一個漢字,得需要多長時間?
這麼大的工作量,換誰也幹不了吧?
所以說,本文要講的 “索引” ,大家在生活中已經接觸過了。比如書本的目錄,字典的目錄,超時貨櫃等
總而言之,言而總之。索引的目的就是爲了加快數據的查詢。僅此而已
mysql中常用的索引類型?
**普通索引**:它是最基本的索引,只是爲了加快數據的查詢速度
**唯一索引**:也是加快查詢速度,不過索引列的值必須唯一,但允許有空值,如果是組合索引,那麼這個
組合列值必須唯一。(例如:a列和b列建立組合索引,a列存儲一個1,b列存儲一個1,往後的存儲a和b
就不能同時都是1了)
**主鍵索引**:它是一種特殊的唯一索引,但不許用空值。一個表只許一個主鍵,且要求自增
**組合索引**: 多個字段建立索引(a+b+c組成的組合索引什麼時候能用到?只要查詢where條件包含
a字段的的都可用到)
**全文索引**: 用來匹配數據(現在很少用啦)
mysql如何創建一個索引?
alter table 表名 add 索引類型 index 索引名 索引字段 索引長度
索引好處這麼明顯?是不是越多越好呢?
答案當然是否定的:
雖然索引極大加快了數據的查詢速度,但卻會減緩更新速度,刪除,修改,插入都會變慢,因爲寫入數據
時候,同時還要把索引文件進行保存(結合實際生活想一想:假如你寫了很多文章,要把這些文章組合成
一本書,然後你寫了目錄,頁碼等,要看某一篇文章確實很快能找到,但是有一天你有寫了幾篇好文章
想加到這本書裏,你總不能只是單純的把文章放到書後面吧,不然以後讀這篇文章不看目錄了?多慢!
所以說,你每次新寫/更新/刪除一個文章,都得寫目錄,是不是影響了插入/更新/刪除速度?)
總結:
要根據自己實際的業務要求建立合理的索引,不要不建立索引,也不要建立太過於複雜的索引。
取其中間就好
如何知道自己的查詢語句有沒有用到索引?
只需要在查詢語句前面加上 mysql的執行計劃: explain (好用不貴) 會出現下圖
參數解析
- select_type 查詢的類型,主要用於區別普通查詢,聯合查詢,子查詢等複雜查詢
參數詳情:
simple:簡單的select查詢,查詢中不包含子查詢或union查詢
primary:查詢中若包含任何複雜的子部分,最外層查詢則被標記爲primary
subquery 在select 或where 列表中包含了子查詢
derived 在from列表中包含的子查詢被標記爲derived,mysql會遞歸這些子查詢,把結果放在臨時表裏
union 做第二個select出現在union之後,則被標記爲union,若union包含在from子句的子查詢中,
外層select將被標記爲 derived
union result 從union表獲取結果的select
-
table :查詢的表名
-
type:查詢類型從最好到最差依次是:system>const>eq_ref>ref>range>index>All,一般情況下,得至少保證達到range級別,最好能達到ref
-
possible_keys 用於顯示可能會用到的索引
-
key: 用於顯示實際使用的索引,如果爲null,表示沒用索引。
-
key_len: 用到的索引長度
-
ref 顯示索引的哪一列被使用了,如果可能的話是一個常數,哪些列或常量被用於查找索引列上的值
-
rows : 估算大概檢索了多少行找到這條數據
-
extra 系統給的查詢建議