最近在面试的过程当中,深感对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的使用。