select * from t1 limit 10 会扫描全表

2023-01-09 11:05:57 +08:00
 ruiyinjinqu

我们写了可以查询生产数据库的运维小工具,方便排查问题,以前不怎么记得表字段,会用这个来查查记录。一直没啥问题,今天用了这个语句,结果执行了很长时间,然后数据库发出 jvm 告警,想问下,这个 sql 会进行全库扫描吗?我一直以为这个直接读取前 10 行就返回数据了。

6730 次点击
所在节点    MySQL
27 条回复
Chinsung
2023-01-09 11:08:29 +08:00
funbox
2023-01-09 11:10:43 +08:00
加一个主键排序
liprais
2023-01-09 11:13:27 +08:00
显然不是全表扫描
wtfedc
2023-01-09 11:40:08 +08:00
type 是 all ,确实是 full table scan 。rows 是查询到满足条件的数据前,大概需要扫描的行数,不是完全精确。
不是说加了索引就一定走索引,在表数据量小的情况下,全表扫描性能可以优于索引。
ttwxdly
2023-01-09 11:56:11 +08:00
显然优化器觉得扫全表比主键快。
idblife
2023-01-09 12:37:51 +08:00
可以查询生产数据库的运维小工具

你们 DBA 是不是想弄死你
bjzhush
2023-01-09 12:53:54 +08:00
select * from table where id >=1 and id <= 100
id 为主键
这样是最好的
hhjswf
2023-01-09 13:00:19 +08:00
是不是数据量太少,优化器感觉这么搞比较快
PendingOni
2023-01-09 13:00:19 +08:00
![屏幕截图_20230109_125850.png]( https://s2.loli.net/2023/01/09/8XKaWdpyn3xUODs.png)
wolfie
2023-01-09 13:05:18 +08:00
这个跟 主键、索引 有关系???
PendingOni
2023-01-09 13:11:05 +08:00
akira
2023-01-09 15:35:46 +08:00
那如何避免这种情况再次出现呢? 提前给表一个别名? 或者 sql 做下正则过滤,确保 limit 后面必须有空格?
ruiyinjinqu
2023-01-09 16:41:07 +08:00
@akira sql 必须带上 where 可以避免
ruiyinjinqu
2023-01-09 16:44:36 +08:00
@idblife 因为每次查数据都要提工单,然后运维部门还没空,一个一下午就能解决的问题,一周都解决不了,所以。。。。
qeqv
2023-01-09 17:12:12 +08:00
MySQL 有反引号,习惯使用就不会出错。
```
select * from `t1` limit 10;
```
idblife
2023-01-09 17:35:23 +08:00
@ruiyinjinqu
在我司这样可能就被开除了
闹着玩呢。。。
ElmerZhang
2023-01-09 20:33:23 +08:00
@ruiyinjinqu 不一定都有 where 的需求,总不能都加个 where 1 = 1 ,傻傻的。我的习惯是查多条时都带上 order by id desc 。
kingpo
2023-01-09 23:36:33 +08:00
select top 10 * from table_name ,只查前 10 ,也没有查全表吧
netabare
2023-01-10 00:53:57 +08:00
………这种关键词一般前后都要加空格的吧
alwaysdazz
2023-01-10 04:02:47 +08:00
查数据的界面没有关键字高亮提示吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX