在使用sql的過程當中常常須要創建索引,而每種索引是怎麼處罰的又是怎麼起到做用的,首先必須知道索引和索引的類型。算法
咱們能夠清楚的看到type那一欄有index ALL eq_ref,他們都表明什麼意思呢?sql
首先類型有許多,這裏我只給你們介紹用的最多的幾種類型:數據庫
system>const>eq_ref>ref>range>index>ALL性能
越往左邊,性能越高,好比system就比ALL類型性能要高出許多,其中system、const只是理想類型,基本達不到;優化
咱們本身實際能優化到ref>range這兩個類型,就是你本身寫SQL,若是你沒優化基本上就是ALL,若是你優化了,那就儘可能達到ref>range這兩個級別;spa
左邊基本達不到!3d
因此,要對type優化的前提是,你須要有索引,若是你連索引都沒有建立,那你就不用優化了,確定是ALL.....;orm
索引類型能是system的只有兩種狀況:blog
1.只有一條數據的系統表索引
只有一條數據的系統表,就是系統裏自帶一張表,而且這個表就一條數據,這個基本上就達不到,這個是系統自帶的表,並且就一條數據,因此基本達不到;
2.或衍生表只能有一條數據的主查詢
這個是能夠實現的,可是在實際開發當中,你不可能去寫一個這麼個玩意兒,不可能公司的業務去讓你把SQL索引類型寫實system...
SQL語句:select * From (select * From test01) t where tid = 1;//前面須要加explain
執行結果:
就是把它湊出來便可;
我之因此能達到system,是由於我知足了它的第二個條件;
const條件稍微低一點,可是基本上也達不到;
1.僅僅能查出一條的SQL語句而且用於Primary key 或 unique索引;
這個我就不說了把,都知道,因此在企業里根本不可能實現,能查出來一條SQL語句,你的索引還必須是Primary key或unique;
SQL語句:select * tid From test01 where tid = 1;//前面須要加explain
執行結果:
根據tid找,由於tid是我設置的主鍵,主鍵就是Primary key,而且只能有一條數據,我表裏面原本就一條,因此我知足了;
惟一性索引:對於每一個索引鍵的查詢,返回 匹配惟一行數據(有且只有1個,不能多,不能0);
解說:好比你select ...from 一張表 where 比方說有一個字段 name = 一個東西,也就是咱們以name做爲索引,假設我以前給name加了一個索引值,我如今根據name去查,查完後有20條數據,我就必須保證這二十條數據每行都是惟一的,不能重複不能爲空!
只要知足以上條件,你就能達到eq_ref,固然前提是你要給name建索引,若是name連索引都沒,那你確定達不到eq_ref;
此種狀況常見於惟一索引和主鍵索引;
好比我根據name去查,可是一個公司裏面或一個學校裏面叫name的可能不止一個,通常你想用這個的時候,就要確保你這個字段是惟一的,id就能夠,你能夠重複兩個張三,可是你身份證確定不會重複;
添加惟一鍵語法:alter table 表名 add constraint 索引名 unique index(列名)
檢查字段是否惟一鍵:show index form 表名;被展現出來的皆是有惟一約束的;
到ref仍是問題不大的,只要你上點心,就能夠達到;
非惟一性索引:對於每一個索引鍵的查詢,返回匹配的全部行(能夠是0,或多個)
假設我如今要根據name查詢,首先name可能有多個,由於一個公司或學校叫小明的不止一我的,可是你要用name去查,你必須name是索引,咱們先給它加個索引,由於要達到ref級別,因此這裏我給它加一個單值索引,
單值索引語法:alter table 表名 索引類型 索引名(字段)
如今咱們根據索引來查數據,這裏我假設我寫的單值索引;
alter table student add index index_name (name);
這個時候咱們再去編寫sql語句:
alter table student add index index_name (name);
由於name是索引列,這裏假設有兩個叫張三的,ref級別規則就是能查出多個或0個,很顯然能查出來多個,那這條SQL語句,必然是ref級別!
執行結果:
數據:
檢索指定範圍的行,查找一個範圍內的數據,where後面是一個範圍查詢 (between,in,> < >=);
注:in 有時會失效,致使爲ALL;
如今咱們寫一個查詢語句,前提是,tid必定是一個索引列,若是是id的話,就用主鍵索引,也就是惟一索引,值不能夠重複,這個時候咱們範圍查詢的時候要用它來作條件:
EXPLAIN SELECT t.* FROM student t WHERE t.tid BETWEEN 1 AND 2; ;//查詢tid是1到2;
查看執行結果:
查詢所有索引中的數據
講解:假設我有一張表,裏面有id name age,這個時候name是一個單值索引,一旦name被設定成索引,它就會成爲B樹同樣,通過各類算法將name裏面的值像樹同樣進行分類,這個時候我where name = **,就至關於把這顆B樹查了一個遍,
也就是說,你把name這一列給查了一遍;
SQL語句:select id From student;//我只查被索引聲明的列,必然就是index了;
執行結果:
查詢所有表數據,就是select name From student;
其中 name 不是索引;
若是你查的這一列不是索引,就會致使全表掃描,因此要避免全表掃描;
執行結果:
主鍵索引(PRIMAY KEY)
惟一索引(UNIQUE)
常規索引(INDEX)
全文索引(FULLTEXT)
主鍵索引
某一個屬性組能惟一標識一條記錄
如:學生表(學號,姓名,班級,性別等等),學號時惟一標識的,能夠做爲主鍵
特色:
最多見的索引類型
確保數據記錄的惟一性
肯定特定數據記錄在數據庫中的位置
實例:
CREATE TABLE `表名`(、
`GradeID` INT(11) AUTO_INCREMENT PRIMARY KEY,
#或 PRIMARY KEY(`GradeID`)
)
做用:
避免同一個表中某數據列中的值重複
與主鍵索引的區別
主鍵索引只能有一個
惟一索引可有多個
實例:
CREATE TABLE `Grade`(、
`GradeID` INT(11) AUTO_INCREMENT PRIMARY KEY,
`GradeName` VARCHAR(32) NOT NULL UNIQUE
#或 UNIQUE KEY ` GradeID`(`GradeID`)
做用:
快速定位特定數據
注意:
index 和 key 關鍵字均可以設置常規索引
應加在查詢條件的字段
不易添加太多常規索引,影響數據的插入,刪除和修改操做
實例:
##建立表時添加
CREATE TABLE `result`{
//省略一些代碼
INDEX / KEY `ind` (`studentNo`,`subjectNo`)
}
##建立後追加
ALTER TABLE `result` ADD INDEX `ind` (`studentNo`,`subjectNo`);
做用:
快速定位特定數據
注意:
只能用於MyISAM類型的數據表
只能用於CHAR ,VARCHAR,TEXT數據列類型
使用大型數據集
實例:
CREATE TABLE `student`(
#省略一些sql語句
FULLTEXT(`StudentName`)
)ENDINE=MYISAM;
ALTER TABLE employee ADD FULLTEXT(`first_name`)