むし 2023-04-19 17:09 采纳率: 71.4%
浏览 20
已结题

初学者的SQL耗时问题咨询

img


<select id="listUser" resultType="hexie.practice.learn.elasticsearch.entity.User">
        SELECT id, user_name, mobile, address FROM user LIMIT 0,#{size}
    </select>

@Autowired
    private UserMapper userMapper;
    @Test
    void test() {
        long l = System.currentTimeMillis();
        List<User> users = userMapper.listUser(7000000);
        long l1 = System.currentTimeMillis();
        System.out.println("耗时: " + (l1 - l) + "ms");
        System.out.println(users.size());
        // 215ms   247ms   292ms    490ms    2883ms   18500ms   62423ms
        //  100    1000    10000   100000   1000000   5000000   7000000
    }

我有一张表user, 里面有一千万个数据, 没加索引, 查询100个数据的时候花费了215ms, 1000个数据247ms, 10000个数据292ms, 如上所示, 为什么花费的时间不是简单的后面加个0?
而且在十万数据量之前, 都是按照差不多1.2的比例增长, 但从1百万开始就是6倍增长, 5百万和7百万的用时差了3.4倍, 为什么会出现这样的情况?

img

直接在Navicat里查的话, 1千万数据都不用8秒, 为什么放到代码里就要花费这么长时间?

  • 写回答

4条回答 默认 最新

  • 乐享技术 2023-04-19 17:47
    关注

    这个问题原因比较复杂,解析基本如下:
    1、你的表没有索引,查询条件也仅是记录限制,数据库的查询就是顺序读取记录。查询时间=读数据时间(从磁盘)+数据筛选时间,你这个单表顺序读,主要是读磁盘时间。
    2、10-100万数据查询时间变化:数据库一般访问磁盘数据时是按页进行,一页大约多少行数据可以计算。因此查10、100、1000...都是读一页,因此耗费时间差不多。当超过一定行的时间后,就要读多页了。如10万到100万出现明显变化,可能10万仅1页,100万可能6-7页。
    3、500到700万变化:这涉及到数据库缓存够不够,可能500万都读到内存处理即可,而700万时内存不够了,就要把结果缓存到磁盘上,因此时间会陡然增加。
    4、最后说下程序时间比navicat长很多:navicat给出的响应时间就是发起数据库查询到形成结果所用时间。而程序中,还需要把结果一一映射成对象。当数据量很大时,生成对象是很耗时的,同时可能由于内存不够,还得用序列化到磁盘保存,这就更耗时。其实数据量不大,两者差异是不明显的,这就是大数据带来的挑战。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月19日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分