前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:数据量很大,分页查询很慢,有什么优化方案?

面试官:数据量很大,分页查询很慢,有什么优化方案?

作者头像
程序员鹏磊
发布于 2019-12-10 09:53:42
发布于 2019-12-10 09:53:42
1.1K00
代码可运行
举报
文章被收录于专栏:架构师专栏架构师专栏
运行总次数:0
代码可运行

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。

准备工作

为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。

1、表名:order_history 2、描述:某个业务的订单历史表 3、主要字段:unsigned int id,tinyint(4) int type 4、字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增。 5、数据量:5709294 6、MySQL版本:5.7.16

线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试。

以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(*) from orders_history;

返回结果:5709294

三次查询时间分别为:

  • 8903 ms
  • 8323 ms
  • 8401 ms

一般分页查询

一般的分页查询使用简单的 limit 子句就可以实现。limit 子句声明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于指定 SELECT 语句返回的记录数。需注意以下几点:

1、第一个参数指定第一个返回记录行的偏移量,注意从0开始 2、第二个参数指定返回记录行的最大数目 3、如果只给定一个参数:它表示返回最大的记录行数目 4、第二个参数为 -1 表示检索从某一个偏移量到记录集的结束所有的记录行 5、初始记录行的偏移量是 0(而不是 1)

下面是一个应用实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=8 limit 1000,10;

该条语句将会从表 orders_history 中查询offset: 1000开始之后的10条数据,也就是第1001条到第1010条数据(1001 <= id <= 1010)。

数据表中的记录默认使用主键(一般为id)排序,上面的结果相当于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=8 order by id limit 10000,10;

三次查询时间分别为:

  • 3040 ms
  • 3063 ms
  • 3018 ms

针对这种查询方式,下面测试查询记录量对时间的影响:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=8 limit 10000,1;
select * from orders_history where type=8 limit 10000,10;
select * from orders_history where type=8 limit 10000,100;
select * from orders_history where type=8 limit 10000,1000;
select * from orders_history where type=8 limit 10000,10000;

三次查询时间如下:

1、查询1条记录:3072ms 3092ms 3002ms 2、查询10条记录:3081ms 3077ms 3032ms 3、查询100条记录:3118ms 3200ms 3128ms 4、查询1000条记录:3412ms 3468ms 3394ms 5、查询10000条记录:3749ms 3802ms 3696ms

另外我还做了十来次查询,从查询时间来看,基本可以确定,在查询记录量低于100时,查询时间基本没有差距,随着查询记录量越来越大,所花费的时间也会越来越多。整编:微信公众号,搜云库技术团队,ID:souyunku

针对查询偏移量的测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=8 limit 100,100;
select * from orders_history where type=8 limit 1000,100;
select * from orders_history where type=8 limit 10000,100;
select * from orders_history where type=8 limit 100000,100;
select * from orders_history where type=8 limit 1000000,100;

三次查询时间如下:

1、查询100偏移:25ms 24ms 24ms 2、查询1000偏移:78ms 76ms 77ms 3、查询10000偏移:3092ms 3212ms 3128ms 4、查询100000偏移:3878ms 3812ms 3798ms 5、查询1000000偏移:14608ms 14062ms 14700ms

随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间急剧增加。

这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度。

使用子查询优化

这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=8 limit 100000,1;

select id from orders_history where type=8 limit 100000,1;

select * from orders_history where type=8 and 
id>=(select id from orders_history where type=8 limit 100000,1) 
limit 100;

select * from orders_history where type=8 limit 100000,100;

4条语句的查询时间如下:

  • 第1条语句:3674ms
  • 第2条语句:1315ms
  • 第3条语句:1327ms
  • 第4条语句:3710ms

针对上面的查询需要注意:

1、比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍 2、比较第2条语句和第3条语句:速度相差几十毫秒 3、比较第3条语句和第4条语句:得益于 select id 速度增加,第3条语句查询速度增加了3倍

这种方式相较于原始一般的查询方法,将会增快数倍。

使用 id 限定优化

这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where type=2 
and id between 1000000 and 1000100 limit 100;

查询时间:15ms 12ms 9ms

这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的id字段,这为分页查询带来很多便利。

还可以有另外一种写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where id >= 1000001 limit 100;

当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from orders_history where id in
(select order_id from trade_2 where goods = 'pen')
limit 100;

这种 in 查询的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit。

使用临时表优化

这种方式已经不属于查询优化,这儿附带提一下。

对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。整编:微信公众号,搜云库技术团队,ID:souyunku

关于数据表的id说明

一般情况下,在数据库中建立表的时候,强制为每一张表添加 id 递增字段,这样方便查询。

如果像是订单库等数据量非常庞大,一般会进行分库分表。这个时候不建议使用数据库的 id 作为唯一标识,而应该使用分布式的高并发唯一 id 生成器来生成,并在数据表中使用另外的字段来存储这个唯一标识。

使用先使用范围查询定位 id (或者索引),然后再使用索引进行定位数据,能够提高好几倍查询速度。即先 select id,然后再 select *;

本人才疏学浅,难免犯错,若发现文中有错误遗漏,望不吝赐教。

敬请关注「搜云库技术团队」微信公众号,获取最新文章

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知我们,我们会立即删除并表示歉意。谢谢!

作者:悠悠

来源:dwz.cn/xU3nHQhO

如果对本文的内容有疑问,请在文章留言区留言,谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
可视化系统搭建--遇见大数据可视化系列文章之四
如何搭建数据可视化系统,用丰富的设计语言清晰表达复杂和庞大数据,并形成鲜明的设计风格?我们把数据可视化的元素进行拆分并建立相应的规范体系。 图表设计 1. 图表基本类型 六种基本图表涵盖了大部分图表使用场景,也是做数据可视化最常用的图表类型: 柱状图   分类照片照片什么照片什么什么项目之间的比较; 饼图   构成即部分占总体的比例; 折线图   随时间变化的趋势; 条形图   分类照片照片什么照片什么什么项目之间的比较; 散点图   相关性或分布关系; 地图   区域之间的分类照片照片什么照片什么什么比较
腾讯ISUX
2018/06/29
1.4K0
数据可视化:如何为数据寻找适合的配色
本期责编:Sophie 文 | Samantha Zhang 来源 | GRAPHIQ 摘要:虽然如今好的配色方案已经唾手可得,但为数据可视化找到合适的配色方案,却仍是一项巨大挑战。 在Graphiq,事情甚至更加棘手,因为我们要通过上千种各不相同的数据集合来传递信息,它们有着各自迥异的视觉表现。 目前的问题 我们没有立刻开始建立自己的配色表,而是发起了一些调查,研究网络上已存在的配色方案。令人惊讶的是,我们发现其中只有少数是为复杂的图表和数据可视化而设计的。我们发现一些不能使用现有配色的原因。 问题1:辨
CDA数据分析师
2018/02/24
1.6K0
数据可视化:如何为数据寻找适合的配色
大数据可视化界面设计—城市计算
项目背景 城市计算是一款利用定位、地图、用户画像的完美结合,为客户提供指定区域的实时人流分布和人群洞察服务的产品。比如某个旅游景区,需要知道每天景区客流量多少,男女比例,以及哪些设施人流多哪些人流少,景区工作人员可以依据这些数据去做优化改进,这类数据展示与数据分析的项目就可以采用城市计算大数据可视化产品 产品目标客户:政府机关、旅游局、交通机构等 用户洞察 通过产品侧前期的用户调研了解到用户更希望看到的是一款炫酷、吸引眼球、数据图表清晰的界面设计,与产品沟通决定尝试采用深色界面设定整体视觉风格。 深色在
腾讯云设计中心
2022/05/05
8090
大数据可视化界面设计—城市计算
「 泛政务设计 」可视化色彩体系的配色方法探索
图表是中后台产品最常见的界面信息元素之一,能够直观地展示数据、支撑观点。因大脑对视觉信息的处理优于对文本的处理,所以把数据进行可视化,可以更容易的解释数据模式、趋势、统计规律和数据相关性,也让视觉上也更丰富、美观。 图表的色板是传达信息、美感和情感的重要元素之一。配色不仅要清晰、准确传达信息,给予用户基本的美感,同时需要在多种颜色中,兼顾品牌感,使图表配色不脱离整体的品牌气质。 那是否有什么方法来指导辅助色的建立呢?本文总结了政务类产品在可视化图表配色上的一些探索思路和实践方法。 设计背景与目标 1. 现状
腾讯云设计中心
2022/05/05
2.3K0
「 泛政务设计 」可视化色彩体系的配色方法探索
遇见大数据可视化 — 图表设计(二)
本文主要阐述了图表设计的重要性,介绍了图表设计的基本原则、视觉元素和层次、图表类型和选择方法、图表设计方法、设计误区以及图表的交互方式。作者通过深入分析图表设计中的各种细节,使读者能够更好地理解和应用图表设计,从而提高数据可视化的效果。
serena
2017/12/08
3.9K2
遇见大数据可视化 — 图表设计(二)
遇见大数据可视化 :图表设计 ( 一 )
腾讯大数据可视化设计团队
2017/07/07
6.6K2
遇见大数据可视化 :图表设计 ( 一 )
数据时代,APP如何进行数据可视化设计?
“Fresh Air”的APP,从设计上区别于常规天气APP,可以根据时间和温度背景色有调整。
Banber可视化云平台
2023/03/24
1.1K0
数据时代,APP如何进行数据可视化设计?
如何设计数据可视化平台
最近在项目上常常听到这样的话:“我想要一个酷炫的数据大屏”,“设计一定要有科技感”,“这个可视化设计没有重点”……每当听到这些需求,作为设计师一般都是欲哭无泪的。到底什么叫酷炫有科技感?客户理解的数据大屏什么样?是数据还是可视化出了问题?? 这篇文章将会结合最近在数据可视化项目上的一些经历,从设计的角度,聊一聊什么是数据可视化,为什么需要可视化设计,以及该从何处着手来设计一个数据可视化平台。 1. 什么是数据可视化设计?(WHAT) 在聊如何设计数据可视化平台前,想先聊一下我所理解的数据可视化。“数据可视化
ThoughtWorks
2022/06/29
1.1K0
如何设计数据可视化平台
【独家】一文读懂数据可视化
前言 数据可视化,是指将相对晦涩的的数据通过可视的、交互的方式进行展示,从而形象、直观地表达数据蕴含的信息和规律。 早期的数据可视化作为咨询机构、金融企业的专业工具,其应用领域较为单一,应用形态较为保守。步入大数据时代,各行各业对数据的重视程度与日俱增,随之而来的是对数据进行一站式整合、挖掘、分析、可视化的需求日益迫切,数据可视化呈现出愈加旺盛的生命力,表现之一就是视觉元素越来越多样,从朴素的柱状图/饼状图/折线图,扩展到地图、气泡图、树图、仪表盘等各式图形。表现之二是可用的开发工具越来越丰富,从专业的
数据派THU
2018/01/29
2.6K0
【独家】一文读懂数据可视化
做好数据可视化的技巧和原则!
导读:其实工作中我们并不需要作出很炫酷的视觉呈现,数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息,有效地传达思想概念,通过直观地传达关键的方面与特征,从而实现对于相当稀疏而又复杂的数据集的深入洞察。因此在设计过程中:每一个选择,最终都应落脚于读者的体验,而非图表制作者个人。
Sam Gor
2020/09/22
1.1K0
做好数据可视化的技巧和原则!
数据可视化设计指南(信息图表篇)
今天分享一篇关于数据可视化设计的好文。 正文 在如今的工作中(尤其是 B 端)越来越多的会开始出现数据可视化的身影,对于一部分小伙伴来说这个概念是较为陌生的,面对这道无形之中提升的“门槛”我们常常会表现的手足无措。所以,为了让大家对于数据可视化不再那么束手无措,我希望能通过这篇文章和大家一起交流学习,解决一些属于我们共同的问题。 那么我们还是老规矩,想要了解一个事物首先需要知道的是它的定义。 数据可视化的基本信息 1. 数据可视化的定义 较为笼统的来说数据可视化是一种由图形、图像、数字等元素组成的语言用
张俊红
2022/08/26
1.1K0
数据可视化设计指南(信息图表篇)
遇见大数据可视化 : 【云图】让数据可见
本文主要讲述了如何利用云图这个数据可视化工具进行数据可视化和图表的生成,通过案例展示了云图的强大之处。文章还介绍了云图的一键式数据可视化功能,以及丰富的图表类型和配色方案,让用户可以快速生成各种类型的图表,满足不同场景的需求。同时,文章还介绍了云图的多种模板,让用户可以直接在模板上进行修改尝试,方便快捷。
腾讯大数据可视化设计团队
2017/11/01
6.5K2
遇见大数据可视化 : 【云图】让数据可见
【数据可视化】深度解析大数据可视化设计案例分析
大数据可视化是个热门话题,在信息安全领域,也由于很多企业希望将大数据转化为信息可视化呈现的各种形式,以便获得更深的洞察力、更好的决策力以及更强的自动化处理能力,数据可视化已经成为网络安全技术的一个重要趋势。 一什么是网络安全可视化 攻击从哪里开始?目的是哪里?哪些地方遭受的攻击最频繁……通过大数据网络安全可视化图,我们可以在几秒钟内回答这些问题,这就是可视化带给我们的效率。大数据网络安全的可视化不仅能让我们更容易地感知网络数据信息,快速识别风险,还能对事件进行分类,甚至对攻击趋势做出预测。可是,该怎么做呢?
陆勤_数据人网
2018/02/26
1.9K0
【数据可视化】深度解析大数据可视化设计案例分析
好看的数据可视化图片是怎样做的?
好看的数据可视化图片是怎么样做的?这里我将介绍如下几个知识点,相信掌握如下数据可视化技巧和知识,一定可以让你的图表焕然一新,令人眼前一亮~
张俊红
2023/03/21
1.2K0
好看的数据可视化图片是怎样做的?
不容忽视的30个数据可视化小技巧
在这里小编给大家总结了数据可视化制作的30个小技巧,通过列举一些容易被忽略的常见错误,希望最终能够快速提升和巩固你的可视化制作水平。
皮大大
2022/01/12
4750
不容忽视的30个数据可视化小技巧
数据图表设计(一)--遇见大数据可视化系列文章之五
By visualizing information, we turn it into a landscape that you can explore with your eyes, a sort of information map. And when you’re lost in information, an information map is kind of useful. 通过可视化信息,我们可以绘制出一道眼睛可以看到的蓝图,一种信息地图。当你迷失在信息中时,信息地图就有作用了。 ——大卫· 
腾讯ISUX
2018/06/29
1.3K0
搞定高质量数据可视化的20条建议
如今,商业领域的决策越来越重视数据驱动,数据可视化已经是当今的潮流。高质量的数据可视化能帮助人们更好地解读数据的意义,发掘数据背后的价值。但是我们发现,实践中很多图表并不容易让人理解,甚至会产生误导。因此本文列出如下20条优化建议,希望能够帮助你实现更好的数据可视化。 01 选择正确的图表类型 如果选择了错误的图表类型,或只是默认使用最常见的图表类型,可能会使用户感到困惑,或对数据的意义产生误解。 一个数据集可以用很多种方式来表述,具体采用哪种方式要取决于用户的需求。 所以一定要从检查数据集和调研用户需求着
张俊红
2022/09/06
2.1K0
搞定高质量数据可视化的20条建议
关于数据可视化图表的制作,你需要关注的30个小技巧
优秀的数据可视化图表只是罗列、总结数据吗?当然不是!数据可视化其真正的价值是设计出可以被读者轻松理解的数据展示,因此在设计过程中,每一个选择,最终都应落脚于读者的体验,而非图表制作者个人。
CDA数据分析师
2020/05/06
1.5K0
遇见大数据可视化:基础研究
杨凯,腾讯用户体验部成都设计中心高级交互设计师。负责腾讯云大数据相关设计,目前专注大数据可视化方向的研究。 近日星巴克与微信推出的社交礼品功能“用星说”,可以说刷遍了朋友圈。无论你爱不爱喝咖啡,星巴克
小莹莹
2018/04/24
7210
遇见大数据可视化:基础研究
数据可视化配色指南:三大配色方法,做出咨询报告一样的图表
可是学习色彩设计,又是十分费工夫的一件事,不仅要搞明白RGB、CMYK等各种颜色体系,搞懂各种配色方法,重点是还要看大量的案例,培养良好的审美观,防止自己做出来的东西辣眼睛……
Python数据科学
2019/10/31
1.8K0
数据可视化配色指南:三大配色方法,做出咨询报告一样的图表
推荐阅读
相关推荐
可视化系统搭建--遇见大数据可视化系列文章之四
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验