高斯DWS数据库分页查询优化思路

除了高斯其它关系型数据可也一样可以使用

官方链接:EXPLAIN_数据仓库服务 GaussDB(DWS)_8.2.0_DML语法_华为云

参考链接:MySQL大数据量分页查询方法及其优化_mysql大数据量分页查询优化-CSDN博客

数据量过大,分页查询优化

背景:数据仓库采用高斯DWS,API平台采用DBAPI,平台限制了一个请求最大3S,因此超过3S的请求将会被取消掉,请求3S并不是SQL执行3S,经过验证,SQL执行九百多毫秒请求就会被杀掉,当前表数据大概四百多万。

直接使用limit加offset

sql 复制代码
explain ANALYSE VERBOSE  select * from  表名 limit 10 offset 402243;
-- 耗时:Total runtime: 8578.479 ms

上面的SQL是最初的SQL,有很多问题,首先列没有裁剪,其次没有建立索引,也没有使用主键,因此下面的优化步骤首先为这张表建一个主键索引,再进行列裁剪

列裁剪加索引

sql 复制代码
explain ANALYSE VERBOSE  select a, b,c, d, e 
from  表名 limit 10 offset 402243
-- 耗时:Total runtime: 1590.931 ms

通过列裁剪加主键索引,耗时已经从8秒多减少到了1.5秒,查询性能提升了很多,但是仍然达不到要求,继续分析,由于已经建立了索引,那么是否可以用自连接,第一步直接查索引,第二步取命中部分数据的所需字段

索引子查询

sql 复制代码
explain ANALYSE VERBOSE  select a,b,c,d,e 
from 表名 
where a in
	(select a from  表名 limit 10 offset 402243)
-- 耗时:Total runtime: 146.485 ms

现在速度已经优化到了1.5毫秒左右,能满足我们的需求,当然用join的写法也是可以的:

sql 复制代码
explain ANALYSE VERBOSE  select a,b,c,d,e 
from 表名 t1 JOIN
(select a from  表名 limit 10 offset 402243) t2
on t1.a = t2.a
-- 耗时:Total runtime: 171.609 ms

使用join和子查询相差不大,都能满足我们的需求,当然我们的平台是基于华为高斯DWS数据库设计的,在过程中也考虑了华为的优化,可参考:优化查询性能概述_数据仓库服务 GaussDB(DWS)_性能调优_华为云

高斯是分布式数据库,将会对数据进行分布式存储,会增加网络之间传输的性能损耗,因此尝试了下每个节点都保存一份数据,是否能增加查询速度,这个做法的弊端在于,数据会在每个查询节点都会存储一份,造成存储资源的浪费,在实际测试中,查询性能并不能得到提升。

相关推荐
编程之升级打怪1 天前
MySQL数据库SQL语句简单用法
sql·mysql
落落12131 天前
MySQL事务四大特性(ACID)
数据库
阿维的博客日记1 天前
Redis的旁路缓存策略和先删除缓存后更新数据库,先更新数据库后删除缓存,这三种策略之间有什么关系??
数据库·redis·缓存
小云小白1 天前
PostgreSQL JDBC 驱动长连接问题:无心跳导致的静默断连
postgresql·springboot·连接超时
ictI CABL1 天前
redis连接服务
数据库·redis·bootstrap
苍煜1 天前
SpringBoot单体应用到分布式下的数据库锁、事务、Redis事务、分布式锁、分布式事务协调
数据库·spring boot·分布式
xmjd msup1 天前
mysql的分区表
数据库·mysql
Lyyaoo.1 天前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM1 天前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens1 天前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql