LIMIT&限制查询结果的数量&ORDER BY&排序&分页

limit:限制查询结果的数量。

举例:
1.查询数据表tb_login,按照id编号进行升序排序,显示前3条记录:
SELECT * FROM tb_login ORDER BY id ASC LIMIT 3;
(ORDER BY用来对查询结果进行排序,分为ASC与DESC,默认ASC(对于NULL值,ASC时出现在最前面,DESC时出现在最后面。))

2.使用关键字LIMIT还可以从查询结果的中间部分取值。首先要定义两个参数,参数1是要开始读取的第一条记录的编号(在查询结果中,第一个结果的记录编号是0,而不是1),参数2是要查询的记录个数(如果查询从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1)。
举例:查询tb_login表中,按照id编号进行升序排列,从编号1开始,查询两条记录:
SELECT * FROM tb_login ORDER BY id ASC LIMIT 1, 2;
--------------------------------------------------------------
以上语句,在表数据很少的时候,看不出什么性能问题,倘若达到千万级,进行分页,如:
SELECT * FROM A ORDER BY id LIMIT 10000000, 10;
虽然都是只查询10条记录,但是这个性能就让人受不了了。此时可以有如下优化方式:
SELECT * FROM A WHERE id >= (SELECT id FROM A LIMIT 10000000, 1) LIMIT 10;
确实这样快了很多,不过前提是,id字段建立了索引。也许这个还不是最优的,还可以这样写:
SELECT * FROM A WHERE id BETWEEN 10000000 AND 10000010;(个人理解:查询的范围更小了)
(在BETWEEN之前还有NOT作为可选项)
-----------------------------------------------------------------------
LIMIT效率高:
常说的LIMIT的执行效率高,是对于一种特定条件下来说的:即数据库的数量很大,但是只需要查询一部分数据的情况。
高效率的原理:避免全表扫描,提高查询效率。
举例:每个用户的email是唯一的,如果用户使用email作为用户名登录的话,就需要查询出email对应的一条记录:
SELECT * FROM t_user WHERE email = ?;
上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低;
SELECT * FROM t_user WHERE email = ? LIMIT 1;
加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。
LIMIT效率低:
在一种情况下,使用LIMIT效率低,那就是:只使用LIMIT来查询语句,并且偏移量特别大。
具体的,采用WHERE...LIMIT...时性能基本稳定,受偏移量和行数影响不大;而单纯采用LIMIT的话,受偏移量影响很大,当偏移量大到一定程度后性能开始大幅下降。不过在数据量不大的情况下,两者的区别不大。
所以应该先使用WHERE等查询语句,然后配合LIMIT使用,效率才高。
注:SQL语句中,LIMIT关键字是最后才用到的。基本顺序为,FROM...WHERE...ORDER BY...LIMIT...

猜你喜欢

转载自www.cnblogs.com/yuanfei1110111/p/10260115.html