むし 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 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站