V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
ruiyinjinqu
V2EX  ›  MySQL

select * from t1 limit 10 会扫描全表

  •  
  •   ruiyinjinqu · 74 天前 · 5838 次点击
    这是一个创建于 74 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  74 天前
    破案 了,limit10 中间没空格,当作表的别名,limit 没生效,查询全表了,大意了!!!
    26 条回复    2023-01-16 14:05:16 +08:00
    Chinsung
        1
    Chinsung  
       74 天前
    funbox
        2
    funbox  
       74 天前
    加一个主键排序
    liprais
        3
    liprais  
       74 天前
    显然不是全表扫描
    wtfedc
        4
    wtfedc  
       74 天前
    type 是 all ,确实是 full table scan 。rows 是查询到满足条件的数据前,大概需要扫描的行数,不是完全精确。
    不是说加了索引就一定走索引,在表数据量小的情况下,全表扫描性能可以优于索引。
    ttwxdly
        5
    ttwxdly  
       74 天前   ❤️ 2
    显然优化器觉得扫全表比主键快。
    idblife
        6
    idblife  
       74 天前
    可以查询生产数据库的运维小工具

    你们 DBA 是不是想弄死你
    bjzhush
        7
    bjzhush  
       74 天前
    select * from table where id >=1 and id <= 100
    id 为主键
    这样是最好的
    hhjswf
        8
    hhjswf  
       74 天前 via Android
    是不是数据量太少,优化器感觉这么搞比较快
    PendingOni
        9
    PendingOni  
       74 天前
    ![屏幕截图_20230109_125850.png]( https://s2.loli.net/2023/01/09/8XKaWdpyn3xUODs.png)
    wolfie
        10
    wolfie  
       74 天前
    这个跟 主键、索引 有关系???
    akira
        12
    akira  
       73 天前
    那如何避免这种情况再次出现呢? 提前给表一个别名? 或者 sql 做下正则过滤,确保 limit 后面必须有空格?
    ruiyinjinqu
        13
    ruiyinjinqu  
    OP
       73 天前
    @akira sql 必须带上 where 可以避免
    ruiyinjinqu
        14
    ruiyinjinqu  
    OP
       73 天前
    @idblife 因为每次查数据都要提工单,然后运维部门还没空,一个一下午就能解决的问题,一周都解决不了,所以。。。。
    qeqv
        15
    qeqv  
       73 天前
    MySQL 有反引号,习惯使用就不会出错。
    ```
    select * from `t1` limit 10;
    ```
    idblife
        16
    idblife  
       73 天前
    @ruiyinjinqu
    在我司这样可能就被开除了
    闹着玩呢。。。
    ElmerZhang
        17
    ElmerZhang  
       73 天前
    @ruiyinjinqu 不一定都有 where 的需求,总不能都加个 where 1 = 1 ,傻傻的。我的习惯是查多条时都带上 order by id desc 。
    kingpo
        18
    kingpo  
       73 天前
    select top 10 * from table_name ,只查前 10 ,也没有查全表吧
    netabare
        19
    netabare  
       73 天前 via Android
    ………这种关键词一般前后都要加空格的吧
    alwaysdazz
        20
    alwaysdazz  
       73 天前 via Android
    查数据的界面没有关键字高亮提示吗
    hdiwhsg
        21
    hdiwhsg  
       73 天前 via iPhone
    xswl
    xaplux
        22
    xaplux  
       73 天前
    。。。。。。
    wetalk
        23
    wetalk  
       73 天前
    啊这这这,缺空格很明显看出来吧。。
    HaoC12
        24
    HaoC12  
       73 天前
    awsl
    ruiyinjinqu
        25
    ruiyinjinqu  
    OP
       73 天前
    @alwaysdazz 自己在管理台写了个简单页面,没有高亮啥的,对请求返回参数还 rsa 加密了 :(
    xlzyxxn
        26
    xlzyxxn  
       67 天前
    2 楼 5 楼说的对
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   4272 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 07:12 · PVG 15:12 · LAX 00:12 · JFK 03:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.