V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
somewheve
V2EX  ›  程序员

问个大佬 sql 问题

  •  
  •   somewheve · 2021-07-16 14:30:03 +08:00 · 1725 次点击
    这是一个创建于 1007 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个表只有 90w 行
    我用 这个查询语句 SELECT count(0) FROM `con_sec_data_v2` 居然要耗时几分钟 。

    同时数据库一直在写入新的数据,包括其他表

    为啥这么耗时啊 以及 sql 语句有其他的吗 ? ===> 查询当前表具体有多少行
    9 条回复    2021-07-19 11:03:25 +08:00
    zlowly
        1
    zlowly  
       2021-07-16 15:59:23 +08:00
    如果表上有主键的话,count (主键字段)可以只做索引扫描,应该会比全表扫描要快。
    myd
        2
    myd  
       2021-07-16 16:10:02 +08:00
    如果是 Innodb 存储引擎,且没有创建辅助索引时,是要全表扫描才能获取到行数的。
    即使有主键索引,也需要全表扫描。

    你需要创建一个辅助索引,只需要扫描辅助索引即可获取到总行数,执行速度在 1 秒内。SQL 直接 count(*)也一样。
    xx6412223
        3
    xx6412223  
       2021-07-16 17:01:20 +08:00   ❤️ 1
    Prior to MySQL 5.7.18, InnoDB processes SELECT COUNT(*) statements by scanning the clustered index. As of MySQL 5.7.18, InnoDB processes SELECT COUNT(*) statements by traversing the smallest available secondary index unless an index or optimizer hint directs the optimizer to use a different index. If a secondary index is not present, the clustered index is scanned.

    创建一个辅助索引,建议用最小字段创建
    mikulch
        4
    mikulch  
       2021-07-16 17:09:36 +08:00
    用你的表里面的,类型小,长度最少的列,创建一个二级索引。然后查询的时候使用 select count(column) from 'table' 来执行覆盖索引扫描,这样子的话就不用执行全表扫描了。
    mikulch
        5
    mikulch  
       2021-07-16 17:10:05 +08:00
    @myd 不使用 count(列名)恐怕不行吧?
    potatosmith
        6
    potatosmith  
       2021-07-16 17:45:58 +08:00
    Innodb 引擎不会存储表的总行数,求总数又不用索引的话只能全表扫描
    onepunch
        7
    onepunch  
       2021-07-17 11:17:23 +08:00
    闲着没事 count 全表干什么
    zhanggang807
        9
    zhanggang807  
       2021-07-19 11:03:25 +08:00
    @JasonLaw bingo
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3020 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:00 · PVG 23:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.