最近写 MySQL 碰到这么个问题. 我只想取数据库中第一条满足条件的记录出来 于是有了这么一条查询语句
select * from table where conditions limit 1;
但在使用过程中,发现这条语句中的 LIMIT 的实际行为其实似乎是 : 对 WHERE 的结果进行的过滤,即数据库 SCAN 出所有满足条件的结果,然后返回了第一条
是否 LIMIT 有其它用法或有其它指令,能实现 找出第一条满足条件的记录,并返回 而不是现在的 先找出所有满足条件的记录,然后返回第一条
如: grep -m 1 re -r file
跟 grep re -r file | head -n 1
的区别
1
liprais 2016-07-09 15:33:48 +08:00 1
"If you combine LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast. If a filesort must be done, all rows that match the query without the LIMIT clause are selected, and most or all of them are sorted, before the first row_count are found. After the initial rows have been found, MySQL does not sort any remainder of the result set."
http://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html RTFM |
2
justjavac 2016-07-09 15:43:23 +08:00 via Android
不会的。
放 MySQL 查询引擎找到合适的记录后,会停止全表扫描的。 |
3
justjavac 2016-07-09 15:45:16 +08:00 via Android 1
当字段有索引时,不会全表扫描。
当没有索引时会全表扫描。 但是当使用 limit 1 时,不会全表扫描。 |
4
HiHi OP |
5
bdbai 2016-07-09 16:51:50 +08:00 via Android
试试 explain
|
6
9hills 2016-07-09 17:38:15 +08:00
MySQL 没有那么傻。。
|
7
Mac 2016-07-09 17:43:26 +08:00
你自己用 heidisql 看返回的查询时间不就知道到底有没有全表搜索了么
|
8
luoyou1014 2016-07-09 17:48:55 +08:00
看有没有 order by ,有 order by 会扫出所有数据然后拿排序结果的第一条数据,没有的话只要找到数据就会直接返回结果。
|
9
kamikat 2016-07-09 18:06:07 +08:00 via Android
COUNT 在 InnoDB 似乎是要扫表的
|
10
SoloCompany 2016-07-09 18:44:50 +08:00
select count() limit 这明显是姿势不对啊, aggressive function 没有 group by 的情况下记录数永远是 1 ,你先搞清楚 limit 作用的是什么
|
11
wodesuck 2016-07-10 14:41:00 +08:00
explain select * from table where conditions limit 1; 看看
讲道理 mysql 应该还是很聪明的 |