SQL優化 MySQL版 - 索引分類、創建方式、刪除索引、查看索引、SQL性能問題
作者 Stanley 羅昊
【轉載請注明出處和署名,謝謝!】
索引分類
單值索引
單的意思就是單列的值,比如說有一張數據庫表,表內有三個字段,分別是 id name age,我給age這個字段加一個索引,這就是單值索引,因為只有age這一列是索引;
一個表可以有多個單值索引,我不光可以設置age,我也可以吧name設置成索引,或許更多;
唯一索引
顧名思義,就是不能重復,比如age就不能被設置為唯一索引,因為年齡肯定是不唯一的,小明18歲,有可能小李也是18歲,這就重復了,所以age這一列不能被設置成唯一索引;
一般唯一索引就是Id;
復合索引
由多個列構成,相當於書的二級目錄,比如我找“趙”這個字,它就先去Z里面找,然后再去zhao里面去找,找兩次;
這個時候我把name跟age它兩個共同組成一個復合索引,意思就是,我先根據name找人,如果名字重復了,我再根據age去找;
復合索引不一定必須兩個列在一起使用,比如找李四,這個表里面就一個李四,就沒有必要再去找age進行篩選;
創建索引的方式一
語法:careate 索引類型 索引名 on 表 (字段)//你現在在給那張表的那個字段加索引
創建單值索引
單值索引索引類型就是index;
careate index dept_index on tb(dept)
講解:我要根據部門進行查詢所以我就給部門加一個單值索引,dept_index就是我起的名字,dept就是部門的意思,名字可以隨便起,但是要有意義,on后面跟上表名,我的數據庫的這張表是tb,所以我寫tb,括號里面寫字段名;
創建唯一索引
careate unique index name_index on tb (name)
講解:unique 與 index 都是索引類型,這里我們就假設name是唯一的,創建方法跟上面一樣,無非就多加了一個unique,去掉unique就是單值索引;
創建復合索引
careate index dept_name_index on tb tb(dept,name);//程序會自動檢測,如果你后面參數只有一個,那就判定你為單值,如果是一個以上,就判定你是復合!
講解:我現在假設dept跟name這倆字段復合,我現在查詢一個人的時候,先看他是哪個部門的(dept)如果大家都是開發部門的,那我再根據名字找,如果你不是開發部門的,那我我就直接找到了,就兩次截然查詢,也就是先根據部門,再根據名字;
創建索引的方式二
語法:alter table 表名 索引類型 索引名(字段)
創建單值索引
alter table tb add index dept_index(dept);
講解:add就表示給tb這張表添加一個為index類型的索引,並起名為dept_index,要被加的字段是dept;
創建唯一索引
alter table tb add unique index name_index(name)
講解:照貓畫虎,跟上放基本一致,假設name字段是唯一不可重復
創建復合索引
alter table tb add index dept_name_index(dept,name)
講解:先dept就是先根據dept查,再去根據name查,這個順序是有意義的!
值得注意的是,兩個創建方式的效果是一樣的,任選其一,均不需要事物的提交(commit),因為兩者都是DDL語句,程序遇到DDL會自動提交,但是你寫了也不報錯,就是什么也沒提交而已;
事物只對DML語句進行操作,也就是增刪改操作,這個需要理解!
注意:
如果一個字段是primary key(主鍵),則該字段默認就是主鍵索引,即便你沒有給他加索引,他也是主鍵索引!
主鍵索引與唯一索引基本相似,區別就是,值不能為Null,而唯一索引可以!
主鍵索引:值不能重復 值不能為null
唯一索引:值不能重復 值可以為null
刪除索引
語法:drop index 索引名 on 表名;
drop index name_index on tb;
講解,我要刪除的索引名字為name_index on 它屬於 tb 表
查詢索引
語法:show index from tb;
解析,看一下tb這張表的索引;
SQL性能問題
1.分析SQSL的執行計划
通過explain,可以模擬SQL優化器執行SQL語句,從而讓開發人員知道自己編寫的狀況;
查詢執行計划:explain+SQL語句;
舉例:explain select * From bbs_detail,看一下執行結果:
我會在下篇文章詳細介紹並且實戰優化,在這里各位僅做了解即可;
解說: id:顧名思義就是查詢編號 select_type:查詢類型 table:你在操作哪一張表 type:類型 key:實際使用的索引,你到底用了哪些索引 possible_keys:預測你用到了哪些索引,假設你用了八個索引,它這里就會顯示八個,但是實際有效的只有五個,所以在key顯示就是五個! key_len:實際使用索引的長度; ref:表和表之間的引用關系; rows:通過索引查詢到的數據量;
Extra:額外的優化信息
2.MySQL查詢優化器會干擾我們的優化
我在前幾章說過有關為什么會干擾我們優化好的SQL語句,因為它內置有一個優化器,它會擅自篡改我們優化好的SQL語句;
今日感悟:
自利偏差告訴我們:
人在失敗時會把原因歸結到別人身上,
成功時更傾向把勞務歸於自己,
印象管理告訴我們:
人在別人的面前,
會不知不覺地進行自我表演。
決斷效應告訴我們:
人在選擇以后,會通過自我說服,來讓自己相信自己的選擇是最好的
自我確定理論告訴我們:
人一般會喜歡和自己相似的人,這里面的愛,包含了對自己的肯定
學習心理學,自己能更好的了解自己,並理解他人;