最近在面試的過程當中,深感對MySQL一些重要命令的缺失。藉着這個機會,補補這塊的知識。不讓本身只會增刪查改,懂一些高級的東西面試
咱們看下面的代碼:優化
1 select id, name from table limit 5, 10spa
一個簡單的limit命令,limit m, n 表明從m+1個開始取n行數據,輸出code
上面也就是從第六行開始,輸出10行。也就是輸出6-15行blog
假設咱們有以下表:索引
數據大概爲100W條數據。it
執行以下命令:table
1 select * from BookIndex limit 10, 10;
用了0s,而且沒有用索引。ast
在執行以下命令:class
1 select * from BookIndex limit 1000000, 10;
一樣十條數據,卻用了0.31秒。一樣是全盤掃描。
下面我用索引優化:
用了0.17秒。 0.31/0.17 大概快了兩倍左右吧。
下面再次優化:
0.00s,能夠說快的不知一點兩點的。
記得用limit必定要用索引,而且若是m(偏移量)過大,先用where篩選一波數據出來在處理。
oder by 非常簡單,並且是默認用了range索引。
默認升序,能夠加上desc變爲降序。
咱們能夠從explain看出,無論是in仍是between都是用了索引。
並且between有一個強大的功能,和limit進行比較的時候。當偏移量較大,但取的數據量較小的時候,用between最爲合適
看一下的實驗
直接0.00s搞定,一點都不含糊。
"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的使用。