sql優(yōu)化及原理詳解,五分鐘讀懂sql優(yōu)化

在我而言這算是一個復(fù)習(xí)季研,然后總結(jié)出來給大家當(dāng)個教材吧敞葛。
我也是看視頻總結(jié)出來的筆記,所以說的都很簡單和淺薄与涡。有不全面或者偏頗的地方歡迎指出惹谐,共同交流進(jìn)步哈。(因為我當(dāng)時是看視頻總結(jié)的筆記驼卖,所以可能說的比較雜亂氨肌,我盡量寫的分明一點(diǎn),在最后會附上筆記酌畜,忽略我字丑)

索引

索引是什么呢怎囚?它相當(dāng)于字典的目錄。
索引:index是幫助mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)檩奠,索引是數(shù)據(jù)結(jié)構(gòu)(樹桩了,默認(rèn)是B樹)附帽,hash等。
索引的弊端:事物都是兩面的井誉,有利必然有弊蕉扮。

  1. 索引本身很大,可以存放在內(nèi)存/硬盤中颗圣。通常存放在硬盤喳钟。
  2. 索引不是所有情況都適用的。不適合建立索引的字段有:
    • 少量數(shù)據(jù)
    • 頻繁更新的字段
    • 很少使用的字段
  3. 索引會降低增刪改的數(shù)據(jù)效率

索引的優(yōu)勢:索引有這么多弊端我們還使用的原因是因為優(yōu)大于劣在岂。

  1. 提高查詢效率(正常一個業(yè)務(wù)奔则,增刪改加一起都不如查詢應(yīng)用的多喲)
  2. 降低cpu使用率(因為B樹本身已經(jīng)排好序了)

索引的分類:

  • 單值索引:單列,一個表可以有多個單值索引
  • 唯一索引:不能重復(fù)的蔽午,一般多是指id
  • 復(fù)合索引:多個列構(gòu)成的索引易茬,相當(dāng)于二級目錄
    這個符合索引還有一些衍生的概念,比如窄索引及老,寬索引抽莱。一般我們把1-2個列組成的索引叫做窄索引。2個列以上組成的索引叫做寬索引骄恶。設(shè)計索引的一個重要原則就是能用窄索引不用寬索引食铐。

舉個小例子讓大家更理解復(fù)合索引:如果我把一個表中name,age這兩個列做成復(fù)合索引(注意順序很重要)僧鲁。那么我們形成的目錄一級目錄是name虐呻,二級目錄是age。在name相同時才會age再形成目錄寞秃。因為它本身的排序不是像目錄一樣一行一行列出來的斟叼,所以我們盡量用目錄來想像它比較好理解。下面是圖解:

復(fù)合索引圖解

這也就涉及到一個索引失效的問題蜕该。我們在創(chuàng)建的時候犁柜,字段A,B,C這樣創(chuàng)建。那么A是一級目錄堂淡,B是二級目錄,C是三級目錄馋缅。我們可以直接只查找A,也可以查找AB,ABC绢淀。但是如果直接查找B或者BC索引就會失效萤悴。想想你拿一個單詞的第二個字母去英語字典里查找。皆的。還用說什么了么覆履?
索引的創(chuàng)建:
創(chuàng)建索引方法很多啊,尤其是現(xiàn)在各種可視化的出現(xiàn)。不過這里還是簡單的寫一下吧硝全,畢竟當(dāng)年也辛辛苦苦記了筆記栖雾。
方式一:create 索引類型 索引名 on 表(字段)

  • 單值索引:create index age_index on demo(age);
  • 唯一索引:create unique index id_index on demo(id);
  • 復(fù)合索引:create index name_age_index on demo(name,age);
    方式二:alter table 表 add 索引類型 索引名(字段)
  • 單值索引:alter table demo add index age_index(age)
  • 唯一索引:alter table demo add unique index id_index(id)
  • 復(fù)合索引:alter table demo add index age_name_index(age,name)

有幾點(diǎn)注意的事項:

  1. alter是ddl,所以不需要commit
  2. 一個字段是primary key伟众,默認(rèn)是主鍵索引析藕。
  3. 唯一索引可以是null,主鍵索引不可以凳厢。
  4. 刪除索引:drop index 索引名 on 表账胧。
  5. 查詢索引:show index from 表。

這里說一下先紫,上面說的方法都是原生的sql治泥,比如我現(xiàn)在習(xí)慣使用navicat,所以可以直接操作遮精。居夹。爽的不行。


navicat直接創(chuàng)建索引

選擇索引列仑鸥,可多選可單選

索引的實現(xiàn)方式吮播,剛就說了可以B樹和hash

然后刪除查詢也都是直接可視的,方便的不得了眼俊。就不多說了。

引擎

mysql做例子粟关,還有個引擎是可以優(yōu)化的疮胖。mysql中引擎分兩種:

  • InnoDB:事物優(yōu)先(適合高并發(fā),是行鎖)
  • MyISAM:性能優(yōu)先(表鎖)
sql需要優(yōu)化的點(diǎn):
  • 性能低
  • 執(zhí)行時間長
  • 等待時間長
  • sql語句欠佳(尤其是連接查詢)
  • 索引失效或者索引無用
  • 服務(wù)器參數(shù)設(shè)置不合適
    這里要額外說一下sql語句的編寫過程和解析過程:
    編寫過程:select ——>dinstinct——>from——>join ——>on——>where——>group by——>having——>order by
    解析過程:form——>on——>join——>where——>group by——>having——>select——>distinct——>order by
    然后我們常說的sql優(yōu)化闷板,主要是優(yōu)化字段類型澎灸,長度,索引等遮晚。
    分析sql執(zhí)行計劃:
    其實我們一個sql語句的執(zhí)行過程是一套流程性昭,因為我不太會用簡書畫圖,所以還是用筆畫圖傳上來吧
    查詢語句執(zhí)行過程

    由此可見县遣,我們寫的sql語句不是直接執(zhí)行的糜颠,還要優(yōu)化器自動優(yōu)化一下。用explain關(guān)鍵字可以模擬優(yōu)化器的執(zhí)行語句萧求。一會兒我們再說這個explain關(guān)鍵字查出來的東西其兴。
    sql優(yōu)化的規(guī)則:
  1. 多表查詢時,先查數(shù)據(jù)量小的表夸政。
  2. 子查詢時元旬,先查詢內(nèi)層在查詢外層。
  3. sql語句優(yōu)化級別從好到壞的等級:
    system>const>eq_ref>ref>range>index>all.

sql優(yōu)化等級:

  1. system是個理想型。就跟語文試卷的一百分似的匀归。不聊這個了坑资。
  2. 當(dāng)用主鍵查詢/唯一查詢時,是const級別的穆端。這個就是我們能做到的最優(yōu)的了袱贮。
  3. eq_ref:唯一性索引,對于索引鍵查詢(有且只有一行數(shù)據(jù)返回)徙赢,常見于主鍵索引和唯一索引(一對一表的外鍵)字柠。
  4. ref:非唯一性索引,單值索引狡赐。就相當(dāng)于一級目錄窑业。
  5. range:查詢指定范圍的行,where后面是個范圍枕屉。這里要注意一點(diǎn)常柄,in會讓索引失效!搀擂!sql優(yōu)化等級會變成all西潘。
  6. index:只查詢索引并且沒有條件。比如上面age是索引了哨颂。然后 select age from demo喷市;這個語句的優(yōu)化等級就是index。
  7. all:這個沒啥說的威恼,就是沒索引品姓,全表掃描。
    8.在explain中Extra的值是Usingfilesort箫措,UsingTemporary:這是一種特殊情況腹备,不僅沒優(yōu)化還有額外的消耗就是這個(這個我沒遇到過,但是能想象的到斤蔓,比如查詢A但是用B分組或者查詢A用B排序)植酥。

上面說的這些等級在explain中可以看到。

單表優(yōu)化常用方法:

  1. 加索引
  2. 調(diào)整sql語句順序
  3. 調(diào)整索引

多表優(yōu)化常用方法:

  1. 小表驅(qū)動大表弦牡。
  2. 小表在左友驮,大表在右。
    程序設(shè)計的原則:雙循環(huán)中喇伯,外層用小表喊儡,內(nèi)層用大表。
    有一點(diǎn)要注意的稻据,使用like的時候艾猜,盡量以常量開頭买喧,如%開頭則索引會失效。sql是否優(yōu)化了可以通過explain查看匆赃。
BTree

因為上面也提到了b樹淤毛,所以還是單獨(dú)聊聊吧。其實我也不是很理解算柳。只能說一個淺顯的認(rèn)識而已低淡。這里也就是簡單的說一下。
首先瞬项,B樹不僅可以二叉蔗蹋,還可以三叉,多叉囱淋。而只要大于二叉的都叫做BTree猪杭。
據(jù)說三層BTree可以存放上百萬數(shù)據(jù)。
BTree一般都指B+樹妥衣,數(shù)據(jù)全部存放在葉節(jié)點(diǎn)中皂吮。(這里簡單的一個三叉樹圖)

b樹

好了,就寫到這里吧税手,希望日后算法的知識會的更多以后能把B樹這個坑填完~~~然后有不同意見或者自己理解的可以留言或者私聊蜂筹。
全文手打,如果你覺得對你有幫助麻煩點(diǎn)個贊點(diǎn)個關(guān)注啥的~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芦倒,一起剝皮案震驚了整個濱河市艺挪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兵扬,老刑警劉巖闺属,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異周霉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亚皂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門俱箱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灭必,你說我怎么就攤上這事狞谱。” “怎么了禁漓?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵跟衅,是天一觀的道長。 經(jīng)常有香客問我播歼,道長伶跷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮叭莫,結(jié)果婚禮上蹈集,老公的妹妹穿的比我還像新娘。我一直安慰自己雇初,他們只是感情好拢肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靖诗,像睡著了一般郭怪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刊橘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天鄙才,我揣著相機(jī)與錄音,去河邊找鬼伤为。 笑死咒循,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绞愚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼位衩,長吁一口氣:“原來是場噩夢啊……” “哼裆蒸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糖驴,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤僚祷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贮缕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辙谜,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年感昼,在試婚紗的時候發(fā)現(xiàn)自己被綠了装哆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡定嗓,死狀恐怖蜕琴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵溅,我是刑警寧澤凌简,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恃逻,受9級特大地震影響雏搂,放射性物質(zhì)發(fā)生泄漏藕施。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一畔派、第九天 我趴在偏房一處隱蔽的房頂上張望铅碍。 院中可真熱鬧,春花似錦线椰、人聲如沸胞谈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烦绳。三九已至,卻和暖如春配紫,著一層夾襖步出監(jiān)牢的瞬間径密,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工躺孝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留享扔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓植袍,卻偏偏與公主長得像惧眠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子于个,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容