V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
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 · Jan 9, 2023 · 7919 views
    This topic created in 1206 days ago, the information mentioned may be changed or developed.

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

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

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