免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MySQL連接查詢&索引介紹

一、常見的join查詢:

join太多張表,也會導致查詢速度變慢。下面就來分析一下join語句。

1. 執(zhí)行順序:

我們寫一條join查詢語句一般都是:

select * from tableA left join tableB on <join condition> where <select condition>

但是MySQL執(zhí)行的時候,并不是按順序執(zhí)行的,MySQL執(zhí)行sql語句是從from開始執(zhí)行的,上面這條語句的執(zhí)行順序是:

from tableA
on <join condition>
left join tableB
where <select condition>

2. 內(nèi)連接inner join:

連接查詢

如圖所示,A和B分別代表兩張表,C是它們共同的部分,inner join查出來的就是C,即表A和表B的共同部分。

select * from A inner join B on A.key = B.key

3. 左連接left join:

還是上面那張圖,A是左表的獨有部分,C是AB的共有部分,left join就是左表的獨有加上兩表的共有,即左表的全部。所以left join查出來的是A表的全部。

select * from A left join B on A.key = B.key

4. 右連接right join:

右連接就是以右表為主,right join查出來的就是B的全部。

select * from A right join B on A.key = B.key

5. 只查詢A的獨占部分:

查詢A的全部就是左連接,那么查詢A獨占就是:

select * from A left join B on A.key = B.key where B.key is null;

6. 只查詢B的獨占部分:

select * from A right join B on A.key = B.key where A.key is null;

7. 全連接:

全連接就是查詢 A + B + C,即圖中所有部分:

select * from A full outer join B on A.key = B.key;

8. 查詢A + B的獨占部分,即排除C:

select * from A full outer join B on A.key = B.key where A.key is null or B.key is null;

二、索引

1. 是什么?

簡單地說,索引是一種數(shù)據(jù)結(jié)構,幫助sql高效獲取數(shù)據(jù)的一種數(shù)據(jù)結(jié)構,可類比字典的索引,可理解為排好序的快速查找的數(shù)據(jù)結(jié)構。所以索引會影響where后面的條件以及order by排序。

索引圖示

比如現(xiàn)在要查找col2為91的這條記錄,首先找到34,發(fā)現(xiàn)91比它大,往它的右邊找,找到89,91還是比它大,繼續(xù)往89右邊找,就找到了91。

一般來說索引本身也很大,不會全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲在硬盤上。

2. 索引的優(yōu)勢:

  • 提高數(shù)據(jù)檢索效率,降低了數(shù)據(jù)庫的IO成本;

  • 通過索引列隊數(shù)據(jù)進行排序,降低了數(shù)據(jù)排序的成本,降低了CPU的消耗。

3. 索引的劣勢:

  • 索引也要占用空間;

  • 雖然提高了讀數(shù)據(jù)的速度,但是降低了寫數(shù)據(jù)的速度,因為寫數(shù)據(jù)的時候還要維護索引;

  • 索引只是提高效率的一個因素,如果有大量的表,就需花時間研究索引怎么建,才是最優(yōu)

4. 索引分類:

假如現(xiàn)有一張user表,有id、name、email等字段。

  • 單值索引:就是用一張表的某一個字段做索引,比如:create index idx_user_name on user(name),這就是在name字段上建了一個單值索引。

  • 唯一索引:索引列的值必須唯一,但允許有空值。

  • 復合索引:用表的某幾個字段做索引,比如:create index idx_user_nameEmail on user(name, email),表示用name和email這兩個字段來建立索引。

那么問題來了,我分別在name和email上建單值索引,和建立一個name和email的復合索引,有什么區(qū)別?這兩種方式都可以達到效果,但是復合索引的開銷更小,因此建一個name和email的復合索引,比在name和email上分別建單值索引更優(yōu)。

5. 基本語法:

  • 創(chuàng)建:create [unique] index indexName on myTable(columnName(length)); 或者alter myTable add [unique] index indexName on (columnName(length));

  • 刪除:drop index indexName on myTable;

  • 查看:show index from myTable;

6. mysql的索引結(jié)構:

MySQL的索引總共有四種,分別是BTree索引、Hash索引、full-text全文索引和R-tree索引,最常用的就是Btree索引。

B樹索引

首先從根節(jié)點開始,如果比17小,就往p1所指區(qū)域找,如果比35大,就往p3所指區(qū)域找,如果介于17和35之間,就往p2所指區(qū)域找。

7. 哪些情況適合建索引?

  • 主鍵自動建立唯一索引;

  • 頻繁作為查詢條件的字段應該建索引;

  • 查詢中與其他表關聯(lián)的字段,應建立外鍵索引;

  • 頻繁更新的字段不應該建立索引;

  • where條件里用不到的字段不應該建索引;

  • 查詢中排序的字段應該建立索引;

  • 查詢中統(tǒng)計或者分組的字段應該建立索引。

8. 哪些情況不適合建索引:

  • 記錄太少的表不適合建索引;

  • 經(jīng)常增刪改的表不適合建索引;

  • 如果某個列的數(shù)據(jù)很多重復的內(nèi)容,比如表示狀態(tài)的status列,不是0就是1,這樣的就沒必要建索引


掃描二維碼

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MySQL優(yōu)化(三) MySQL 卓越資源
[MySQL] mysql優(yōu)化實例-為join表關聯(lián)字段增加索引
數(shù)據(jù)庫索引介紹及使用
mysql 索引
大廠經(jīng)典面試系列之四:螞蟻金服Java開發(fā)面試【建議關注收藏訂閱,你早晚會用上】掌握了這些面試題,余生不在怕面試
《High Performance MySQL》讀書筆記
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服