前言
這篇博文是對尚硅谷MySQL高級課程的總結(jié)。
一、存儲(chǔ)引擎簡介

二、JOIN語句總結(jié)

其中因?yàn)镸ySQL沒有外鏈接,所以外鏈接部分的SQL語句和圖中的有區(qū)別,下面是上圖中第五個(gè)圖的SQL語句:
select * from tablea a left join tableb b on a.key = b.key
union
select * from tablea a right join tableb b on a.key = b.key
第六個(gè)圖的SQL語句:
select * from tablea a left join tableb b on a.key = b.key where b.key is null
union
select * from tablea a right join tableb b on a.key = b.key where a.key is null
三、索引
1、什么是索引?
MySQL官方對索引的定義為:索引是幫助MySQL高速獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),可以簡單理解為,索引就是一種排好序的快速查找數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
2、MySQL中的索引是哪種數(shù)據(jù)結(jié)構(gòu)?
MySQL中的索引,如果沒有特別指明,都是指B+樹,除了B+樹這種索引外,還有哈希索引等。
3、索引的優(yōu)點(diǎn)和缺點(diǎn)
既然索引是一種排好序的可以快速查找數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),那么我想優(yōu)點(diǎn)也就很明確了,那就是可以使用索引快速的查找到想找的數(shù)據(jù),并且可以借助索引快速的排序,這里我還是希望不懂?dāng)?shù)據(jù)結(jié)構(gòu)的可以去查查相關(guān)的資料,畢竟數(shù)據(jù)結(jié)構(gòu)是比較抽象的,如果之前沒有聽說過肯定會(huì)想知道為啥用了數(shù)據(jù)結(jié)構(gòu)就可以快速的排序和查找了,這里可以好好學(xué)習(xí)一下樹這種數(shù)據(jù)結(jié)構(gòu),然后你就會(huì)豁然開朗。
索引的缺點(diǎn)就是索引本身會(huì)占用空間,并且會(huì)降低insert、update、delete操作的性能,因?yàn)楫?dāng)表改動(dòng)時(shí),索引也會(huì)發(fā)生改變,索引的改變也會(huì)消耗時(shí)間,所以對于經(jīng)常增刪改的表并不適合創(chuàng)建索引。
4、索引的種類
- 單值索引:一個(gè)索引只包含一個(gè)列,一個(gè)表可以有多個(gè)單值索引,創(chuàng)建索引的語法:
第一種
CREATE INDEX indexName ON tableName(columnName);
第二種
ALTER table tableName ADD INDEX indexName(columnName);
- 唯一索引:索引列的值必須唯一,但是可以為空,創(chuàng)建索引的語法:
第一種
CREATE UNIQUE INDEX indexName ON tableName(columnName);
第二種
ALTER table tableName ADD UNIQUE [indexName] (columnName);
- 復(fù)合索引:一個(gè)索引包含多個(gè)列,創(chuàng)建索引的語法:
第一種
CREATE INDEX indexName ON tableName(columnName1, columnName2);
第二種
ALTER table tableName ADD INDEX indexName(columnName1, columnName2);
刪除索引的語法:
drop index [indexName] on tableName;
查看索引的語法:
show index from tableName;
5、創(chuàng)建索引的一些建議
- 主鍵自動(dòng)創(chuàng)建唯一索引
- 頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
- 查詢中與其他表關(guān)聯(lián)的字段,比如外鍵需要建立索引
- 頻繁更新的字段不適合創(chuàng)建索引
- where條件中用不到的字段不創(chuàng)建索引
- 在高并發(fā)下傾向于創(chuàng)建組合索引
- 需要排序的字段創(chuàng)建索引會(huì)大大提高排序的速度
- 查詢中的統(tǒng)計(jì)或分組字段需要?jiǎng)?chuàng)建索引
- 表中數(shù)據(jù)很少的情況下不推薦創(chuàng)建索引
- 經(jīng)常增刪改的表不適合創(chuàng)建索引
- 數(shù)據(jù)重復(fù)且平均分配的表字段不適合創(chuàng)建索引
6、學(xué)一一下怎么怎么使用explain分析SQL性能
我們在學(xué)習(xí)如何創(chuàng)建高效的索引之前需要先學(xué)習(xí)一下怎么分析SQL的性能,要不我們怎么知道創(chuàng)建索引后是不是比以前快了很多,或者我們?nèi)绾沃酪粭lSQL是否用到了我們創(chuàng)建的索引,這些我們就需要使用explain命令,這里就給出一個(gè)博客,博客中有很詳細(xì)的教程:MySQL 性能優(yōu)化神器 Explain 使用分析
7、如何創(chuàng)建高效的索引
其實(shí)只要我們創(chuàng)建的索引在查詢和排序時(shí)能夠被用上,那么這個(gè)索引就是一個(gè)成功的索引,我們學(xué)習(xí)如何創(chuàng)建高效的索引其實(shí)就是學(xué)習(xí)如何創(chuàng)建一個(gè)不會(huì)失效的索引,我們以下索引為例:
CREATE INDEX indexName ON tableName(a, b, c);
索引的使用分為排序和查找,下面的規(guī)則適合于查找,也就是where子句中:
- 盡量使用全部全值匹配,例如
where a=1 and b=2 and c=3,順序可以打亂,但是最好按照索引的順序進(jìn)行查找。 - 最佳左前綴法則:如果是復(fù)合索引,查詢從索引的最左前列開始,不跳過索引中的列
- 不在索引列上進(jìn)行任何操作(計(jì)算、函數(shù)、類型轉(zhuǎn)換)
- 盡量不要使用
select *,盡量只查詢索引中的列這里就是select a,b,c - 不要使用
!=或者<>,會(huì)導(dǎo)致索引失效 -
is null、is not null會(huì)導(dǎo)致索引失效 - 如果使用
like,不要在查詢目標(biāo)前加%,例如%abcd、%das%,可是使用dasd%,但是會(huì)使復(fù)合索引中的一部分失效。 - 字符串類型的查找值一定要加單引號(重點(diǎn))
- 少用
or,用它來連接時(shí)會(huì)使索引失效
下面是排序時(shí)的規(guī)則,也就是用在order by 子句中:
- 同樣是最佳左前綴法則:如果是復(fù)合索引,排序條件從索引的最左前列開始,不跳過索引中的列
- 如果前面的
where子句中使用了最左前綴,并且是用的=來限定條件,那么order by中就可以越過最左前綴,直接使用后面的索引來作為排序條件,例如:where a=123 order by b,c
當(dāng)使用group by子句時(shí),和使用order by子句的規(guī)則相同。