大厂面试官:千万级数据量的表,如何进行快速查询?,2024年最新java初级工程师面试题

MySQL分页查询语法如下:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

  • 第一个参数指定第一个返回记录行的偏移量

  • 第二个参数指定返回记录行的最大数目

下面我们开始测试查询结果:

SELECT * FROM user_operation_log LIMIT 10000, 10

查询3次时间分别为:

  • 59 ms

  • 49 ms

  • 50 ms

这样看起来速度还行,不过是本地数据库,速度自然快点。

换个角度来测试

相同偏移量,不同数据量

SELECT * FROM user_operation_log LIMIT 10000, 10

SELECT * FROM user_operation_log LIMIT 10000, 100

SELECT * FROM user_operation_log LIMIT 10000, 1000

SELECT * FROM user_operation_log LIMIT 10000, 10000

SELECT * FROM user_operation_log LIMIT 10000, 100000

SELECT * FROM user_operation_log LIMIT 10000, 1000000

查询时间如下:

| 数量 | 第一次 | 第二次 | 第三次 |

| — | — | — | — |

| 10条 | 53ms | 52ms | 47ms |

| 100条 | 50ms | 60ms | 55ms |

| 1000条 | 61ms | 74ms | 60ms |

| 10000条 | 164ms | 180ms | 217ms |

| 100000条 | 1609ms | 1741ms | 1764ms |

| 1000000条 | 16219ms | 16889ms | 17081ms |

从上面结果可以得出结束:数据量越大,花费时间越长

相同数据量,不同偏移量

SELECT * FROM user_operation_log LIMIT 100, 100

SELECT * FROM user_operation_log LIMIT 1000, 100

SELECT * FROM user_operation_log LIMIT 10000, 100

SELECT * FROM user_operation_log LIMIT 100000, 100

SELECT * FROM user_operation_log LIMIT 1000000, 100

| 偏移量 | 第一次 | 第二次 | 第三次 |

| — | — | — | — |

| 100 | 36ms | 40ms | 36ms |

| 1000 | 31ms | 38ms | 32ms |

| 10000 | 53ms | 48ms | 51ms |

| 100000 | 622ms | 576ms | 627ms |

| 1000000 | 4891ms | 5076ms | 4856ms |

从上面结果可以得出结束:偏移量越大,花费时间越长

SELECT * FROM user_operation_log LIMIT 100, 100

SELECT id, attr FROM user_operation_log LIMIT 100, 100

如何优化


既然我们经过上面一番的折腾,也得出了结论,针对上面两个问题:偏移大、数据量大,我们分别着手优化

优化偏移量大问题
采用子查询方式

我们可以先定位偏移位置的 id,然后再查询数据

SELECT * FROM user_operation_log LIMIT 1000000,

10SELECT id FROM user_operation_log LIMIT 1000000,

1SELECT * FROM user_operation_log WHERE id >= (

SELECT id FROM user_operation_log LIMIT 1000000,

1

) LIMIT 10

查询结果如下:

| sql | 花费时间 |

| — | — |

| 第一条 | 4818ms |

| 第二条(无索引情况下) | 4329ms |

| 第二条(有索引情况下) | 199ms |

| 第三条(无索引情况下) | 4319ms |

| 第三条(有索引情况下) | 201ms |

从上面结果得出结论:

  • 第一条花费的时间最大,第三条比第一条稍微好点

  • 子查询使用索引速度更快

缺点:只适用于id递增的情况

id非递增的情况可以使用以下写法,但这种缺点是分页查询只能放在子查询里面

注意:某些 mysql 版本不支持在 in 子句中使用 limit,所以采用了多个嵌套select

SELECT * FROM user_operation_log WHERE id IN (

SELECT t.id FROM (

SELECT id FROM user_operation_log LIMIT 1000000,

10

) AS t

)

采用 id 限定方式

这种方法要求更高些,id必须是连续递增,而且还得计算id的范围,然后使用 between,sql如下

SELECT * FROM user_operation_log WHERE id between 1000000 AND 1000100 LIMIT 100SELECT * FROM user_operation_log WHERE id >= 1000000 LIMIT 100

查询结果如下:

| sql | 花费时间 |

| — | — |

| 第一条 | 22ms |

| 第二条 | 21ms |

从结果可以看出这种方式非常快

注意:这里的 LIMIT 是限制了条数,没有采用偏移量

优化数据量大问题

返回结果的数据量也会直接影响速度

SELECT * FROM user_operation_log LIMIT 1, 1000000

SELECT id FROM user_operation_log LIMIT 1, 1000000

SELECT id, user_id, ip, op_data, attr1, attr2, attr3, attr4, attr5, attr6, attr7, attr8, attr9, attr10, attr11, attr12 FROM user_operation_log LIMIT 1, 1000000

查询结果如下:

| sql | 花费时间 |

| — | — |

| 第一条 | 15676ms |

| 第二条 | 7298ms |

| 第三条 | 15960ms |

从结果可以看出减少不需要的列,查询效率也可以得到明显提升

第一条和第三条查询速度差不多,这时候你肯定会吐槽,那我还写那么多字段干啥呢,直接 * 不就完事了

注意本人的 MySQL 服务器和客户端是在_同一台机器_上,所以查询数据相差不多,有条件的同学可以测测客户端与MySQL分开

SELECT * 它不香吗?

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

image.png

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-KTTRCt8R-1712979490007)]

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

[外链图片转存中…(img-Lma7UyDh-1712979490008)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-yNgrLJjx-1712979490008)]

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《互联网大厂Java工程师面试题.pdf》是一份面试题集合,主要用于考察Java工程师的技术水平和编程能力。这份面试题可能涵盖了Java基础知识、面向对象编程、多线程与并发、网络编程、数据库操作等方面的内容。 在面对这份面试题时,Java工程师需要对Java语言的特性和使用有深入的了解,能够熟练使用Java的各种关键字、数据类型、流程控制语句等。此外,还需要了解Java的面向对象编程思想,熟悉封装、继承、多态等概念,并能够运用这些知识进行编程。 同时,Java工程师还需要对多线程与并发编程有一定的了解,知道如何创建和管理线程、同步和互斥等操作,以及如何处理线程安全的问题。 在网络编程方面,Java工程师需要掌握Socket编程、HTTP协议等知识,能够实现客户端和服务器之间的数据交互。 对于数据库操作,Java工程师需要熟悉SQL语言,能够运用JDBC等技术与数据库进行交互,实现数据的增删改查等常见操作。 在回答这些面试题时,Java工程师需要清晰、准确地达自己的思路和解决方案,并且能够合理地优化代码,具备较强的编程和逻辑思维能力。 最后,Java工程师还需要注重实践和项目经验的积累,在实际的开发项目中不断学习和实践,提升自己的技术水平。同时,要关注行业的最新动态,并积极参与学习和交流,保持对新技术的敏感度和学习能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值