--limit 的使用
select 。。。。[LIMIT offerset_start,row_count]其中offerset_start 表上记录的起
limit rowstart,rowcount 类似与分页查询,rowstart是从第几行开始,rowcount是包括此后几行,
在一些情况中,当你使用LIMIT row_count而不使用HAVING时,MySQL将以不同方式处理查询。
始偏移量,默认为0,只需记录数据行就可以了。row_count为显示的行数。
---显示第一行。
mysql> select * from emp order by birdate desc limit 1;
+-------+----------+------------+--------+
| eid | ename | birdate | deptno |
+-------+----------+------------+--------+
| 10001 | zhangsan | 1988-09-27 | 1001 |
+-------+----------+------------+--------+
1 row in set (0.00 sec)
---显示前两行。
mysql> select * from emp order by birdate desc limit 2;
+-------+----------+------------+--------+
| eid | ename | birdate | deptno |
+-------+----------+------------+--------+
| 10001 | zhangsan | 1988-09-27 | 1001 |
| 10003 | lily | 1988-09-17 | 1003 |
+-------+----------+------------+--------+
2 rows in set (0.00 sec)
--显示从第一行开始以后(不包括第一行)的三行数据。
注意limit显示的时候不包括offerset_start那一行。如下面的offerset_start=1 则不包括第一行。
mysql> select * from emp order by birdate desc limit 1,3;
+-------+--------+------------+--------+
| eid | ename | birdate | deptno |
+-------+--------+------------+--------+
| 10003 | lily | 1988-09-17 | 1003 |
| 10002 | yangql | 1987-12-30 | 1003 |
+-------+--------+------------+--------+
2 rows in set (0.02 sec)
--显示从第三行记录开始,以后的三行,如果没有足够的数据,则显示offerset_start以后的所有记录。
mysql> select * from emp order by birdate desc limit 2,3;
+-------+--------+------------+--------+
| eid | ename | birdate | deptno |
+-------+--------+------------+--------+
| 10002 | yangql | 1987-12-30 | 1003 |
+-------+--------+------------+--------+
1 row in set (0.00 sec)
mysql> select * from emp order by birdate desc limit 1,1;
+-------+-------+------------+--------+
| eid | ename | birdate | deptno |
+-------+-------+------------+--------+
| 10003 | lily | 1988-09-17 | 1003 |
+-------+-------+------------+--------+
1 row in set (0.00 sec)
mysql> select * from emp order by birdate desc limit 1,2;
+-------+--------+------------+--------+
| eid | ename | birdate | deptno |
+-------+--------+------------+--------+
| 10003 | lily | 1988-09-17 | 1003 |
| 10002 | yangql | 1987-12-30 | 1003 |
+-------+--------+------------+--------+
2 rows in set (0.00 sec)
mysql> select * from emp order by birdate desc limit 0,1;
+-------+----------+------------+--------+
| eid | ename | birdate | deptno |
+-------+----------+------------+--------+
| 10001 | zhangsan | 1988-09-27 | 1001 |
+-------+----------+------------+--------+
1 row in set (0.00 sec)
mysql> select * from emp order by birdate desc limit 0,3;
+-------+----------+------------+--------+
| eid | ename | birdate | deptno |
+-------+----------+------------+--------+
| 10001 | zhangsan | 1988-09-27 | 1001 |
| 10003 | lily | 1988-09-17 | 1003 |
| 10002 | yangql | 1987-12-30 | 1003 |
+-------+----------+------------+--------+
3 rows in set (0.00 sec)
MySQL如何优化LIMIT
·如果你用LIMIT只选择一些行,当MySQL选择做完整的表扫描时,它将在一些情况下使用索引。
·如果你使用LIMIT row_count与ORDER BY,MySQL一旦找到了排序结果的第一个row_count行,将结束排序而不是排序整个表。如果使用索引,将很快。如果必须进行文件排序(filesort),必须选择所有匹配查询没有LIMIT子句的行,并且在确定已经找到第1个row_count行前,必须对它们的大部分进行排序。在任何一种情况下,一旦找到了行,则不需要再排序结果的其它部分,并且MySQL不再进行排序。
·当结合LIMIT row_count和DISTINCT时,MySQL一旦找到row_count个唯一的行,它将停止。
·在一些情况下,GROUP BY能通过顺序读取键(或在键上做排序)来解决,然后计算摘要直到关键字的值改变
。在这种情况下,LIMIT row_count将不计算任何不必要的GROUP BY值。
·只要MySQL已经发送了需要的行数到客户,它将放弃查询,除非你正使用SQL_CALC_FOUND_ROWS。
·LIMIT 0将总是快速返回一个空集合。这对检查查询的有效性是有用的。当使用MySQL API时,它也可以用来得到结果列的列类型。
(该技巧在MySQL Monitor中不工作,只显示Empty set;应使用SHOW COLUMNS或DESCRIBE)。
· 当服务器使用临时表来进行查询时,使用LIMIT row_count子句来计算需要多少空间。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22664653/viewspace-682933/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22664653/viewspace-682933/