在我而言這算是一個復(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等。
索引的弊端:事物都是兩面的井誉,有利必然有弊蕉扮。
- 索引本身很大,可以存放在內(nèi)存/硬盤中颗圣。通常存放在硬盤喳钟。
- 索引不是所有情況都適用的。不適合建立索引的字段有:
- 少量數(shù)據(jù)
- 頻繁更新的字段
- 很少使用的字段
- 索引會降低增刪改的數(shù)據(jù)效率
索引的優(yōu)勢:索引有這么多弊端我們還使用的原因是因為優(yōu)大于劣在岂。
- 提高查詢效率(正常一個業(yè)務(wù)奔则,增刪改加一起都不如查詢應(yīng)用的多喲)
- 降低cpu使用率(因為B樹本身已經(jīng)排好序了)
索引的分類:
- 單值索引:單列,一個表可以有多個單值索引
- 唯一索引:不能重復(fù)的蔽午,一般多是指id
- 復(fù)合索引:多個列構(gòu)成的索引易茬,相當(dāng)于二級目錄
這個符合索引還有一些衍生的概念,比如窄索引及老,寬索引抽莱。一般我們把1-2個列組成的索引叫做窄索引。2個列以上組成的索引叫做寬索引骄恶。設(shè)計索引的一個重要原則就是能用窄索引不用寬索引食铐。
舉個小例子讓大家更理解復(fù)合索引:如果我把一個表中name,age這兩個列做成復(fù)合索引(注意順序很重要)僧鲁。那么我們形成的目錄一級目錄是name虐呻,二級目錄是age。在name相同時才會age再形成目錄寞秃。因為它本身的排序不是像目錄一樣一行一行列出來的斟叼,所以我們盡量用目錄來想像它比較好理解。下面是圖解:
這也就涉及到一個索引失效的問題蜕该。我們在創(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)注意的事項:
- alter是ddl,所以不需要commit
- 一個字段是primary key伟众,默認(rèn)是主鍵索引析藕。
- 唯一索引可以是null,主鍵索引不可以凳厢。
- 刪除索引:drop index 索引名 on 表账胧。
- 查詢索引:show index from 表。
這里說一下先紫,上面說的方法都是原生的sql治泥,比如我現(xiàn)在習(xí)慣使用navicat,所以可以直接操作遮精。居夹。爽的不行。
然后刪除查詢也都是直接可視的,方便的不得了眼俊。就不多說了。
引擎
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ī)則:
- 多表查詢時,先查數(shù)據(jù)量小的表夸政。
- 子查詢時元旬,先查詢內(nèi)層在查詢外層。
- sql語句優(yōu)化級別從好到壞的等級:
system>const>eq_ref>ref>range>index>all.
sql優(yōu)化等級:
- system是個理想型。就跟語文試卷的一百分似的匀归。不聊這個了坑资。
- 當(dāng)用主鍵查詢/唯一查詢時,是const級別的穆端。這個就是我們能做到的最優(yōu)的了袱贮。
- eq_ref:唯一性索引,對于索引鍵查詢(有且只有一行數(shù)據(jù)返回)徙赢,常見于主鍵索引和唯一索引(一對一表的外鍵)字柠。
- ref:非唯一性索引,單值索引狡赐。就相當(dāng)于一級目錄窑业。
- range:查詢指定范圍的行,where后面是個范圍枕屉。這里要注意一點(diǎn)常柄,in會讓索引失效!搀擂!sql優(yōu)化等級會變成all西潘。
- index:只查詢索引并且沒有條件。比如上面age是索引了哨颂。然后 select age from demo喷市;這個語句的優(yōu)化等級就是index。
- all:這個沒啥說的威恼,就是沒索引品姓,全表掃描。
8.在explain中Extra的值是Usingfilesort箫措,UsingTemporary:這是一種特殊情況腹备,不僅沒優(yōu)化還有額外的消耗就是這個(這個我沒遇到過,但是能想象的到斤蔓,比如查詢A但是用B分組或者查詢A用B排序)植酥。
上面說的這些等級在explain中可以看到。
單表優(yōu)化常用方法:
- 加索引
- 調(diào)整sql語句順序
- 調(diào)整索引
多表優(yōu)化常用方法:
- 小表驅(qū)動大表弦牡。
- 小表在左友驮,大表在右。
程序設(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樹這個坑填完~~~然后有不同意見或者自己理解的可以留言或者私聊蜂筹。
全文手打,如果你覺得對你有幫助麻煩點(diǎn)個贊點(diǎn)個關(guān)注啥的~~