前言: 最近在面試的過程中,深感對MySQL一些重要命令的缺失。藉著這個機會,補補這塊的知識。不讓自己只會增刪查改,懂一些高級的東西 limit 用法 order by 用法 in 和 between的用法 join的用法 (一)limit用法 我們看下麵的代碼: 1 select id, name ...
前言:
最近在面試的過程中,深感對MySQL一些重要命令的缺失。藉著這個機會,補補這塊的知識。不讓自己只會增刪查改,懂一些高級的東西
- limit 用法
- order by 用法
- in 和 between的用法
- join的用法
(一)limit用法
我們看下麵的代碼:
1 select id, name from table limit 5, 10
一個簡單的limit命令,limit m, n 代表從m+1個開始取n行數據,輸出
上面也就是從第六行開始,輸出10行。也就是輸出6-15行
假設我們有如下表:
數據大概為100W條數據。
執行如下命令:
1 select * from BookIndex limit 10, 10;
用了0s,並且沒有用索引。
在執行如下命令:
1 select * from BookIndex limit 1000000, 10;
同樣十條數據,卻用了0.31秒。同樣是全盤掃描。
下麵我用索引優化:
用了0.17秒。 0.31/0.17 大概快了兩倍左右吧。
下麵再次優化:
0.00s,可以說快的不知一點兩點的。
記得用limit一定要用索引,並且如果m(偏移量)過大,先用where篩選一波數據出來在處理。
(二)order by用法
oder by 很是簡單,而且是預設用了range索引。
預設升序,可以加上desc變為降序。
(三)in 和 between的用法
我們可以從explain看出,不管是in還是between都是用了索引。
而且between有一個強大的功能,和limit進行比較的時候。當偏移量較大,但取的數據量較小的時候,用between最為合適
看一下的實驗
直接0.00s搞定,一點都不含糊。
(四)join的用法
- JOIN: 如果表中有至少一個匹配,則返回行
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就返回行
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
inner join:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
left join:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
註意到沒有最後一行OrderNo為空
right join:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
後言:
寫完後,發覺好累,真的好累。寫了兩個多小時了,求爸爸讓我上熱門。
不過對MySQL的一些理解也更加深刻了,尤其是limit的使用。