MySQL数据库面试题:一千万的数据 应该如何查询?(3)
MySQL数据库面试题
查询结果如下:
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 100
SELECT * 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 * 它不香吗?
在这里顺便补充一下为什么要禁止SELECT *。难道简单无脑,它不香吗?
主要两点:
- 用 “SELECT *” 数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。
- 增大网络开销,*有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。特别是MySQL和应用程序不在同一台机器,这种开销非常明显。
本文分享的MySQL数据库面试题、一千万的数据、应该如何查询的详细介绍,您了解和帮助到您了吗?
相关阅读
-
什么是网络附加存储 NAS? 网络附加存储的适用场景有哪些
一篇很详细的教程是关于什么是网络附加存储方面的介绍,一起来了解了解吧。 网络附加存储(Network-Attached Storage,简称NAS)是一种基于网络的存储解决方案,允许多个设备通过网络共享存储
-
在线网页制作系统有哪些 网页设计制作网站推荐
IT电脑小知识篇,关于在线网页制作系统有哪些和网页设计制作网站推荐的IT小经验,很不错的方法小知识,建议收藏哦! HTML5多媒体作品以其对各种平台的兼容而见长,目前已获得了广泛的应
-
远程数据库连接慢有哪些原因 数据库连接速度缓慢的解决方法
本文为您带来的是远程数据库连接慢有哪些原因的相关介绍,一起跟随小编看看吧! 数据库连接速度缓慢可能有多种原因,以下是一些可能的原因及其相应的解决方法: 网络延迟 :数据库服
-
Web标准全面解析:构建高质量网站的基石
小编为你介绍Web标准全面解析的IT小经验,一起来了解了解吧。 1. 引言 随着互联网的快速发展,Web技术不断地向前演进,各种浏览器、设备和操作系统纷繁复杂。 为了确保网站在不同环境下都


