当前位置: 首页 > news >正文

编程技巧:SQL 处理超大查询

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


一、数据库对内存和执行时间的限制

        处理数据库的时候很头疼的是数据库管理员很讨厌!非常讨厌!莫名其妙地,查询就失败了,连接就被复位了,怎么回事?因为数据库管理员干预了。

        查询数据量太大?不可以!查询时间太长?不可以!他就管他的数据库不要垮,不管你需要什么、不管客户需要什么!

        不过也要互相理解啊,大家都不容易,搞死了数据库大家都玩完。

二、分段查询(分页查询)

        所以遇到超大查询时我们一般会分段执行,限制返回的数据量,这种技术在前端也被称为“分页查询”。(分页就分页吧,你默认返回10行是怎么想的?你的屏幕这么小?)

        不吐槽前端了,我们做大业务处理的需要尽可能多返回数据,同时还要照顾数据库管理员的情绪,所以我们除了做分段还要耍点花招,毕竟分段太小会降低性能啊。

        我们要一个复杂一点的策略:自动寻找最合适分段。

三、动态分段大小的例程

        下面就是一个自动寻找最合适分段的例子,策略也不复杂:先从一个足够巨大的limit(mysql是limit,别的数据库应该不一样,比如oracle是rownum)开始,如果执行失败就减半,直到成功。

        代码如下(C#的,不过原理都是相同的):

				Int32 last_id = Int32.MinValue;int limit = 100 * 10000;int total_records = 0;while (true){StringBuilder sql = new StringBuilder();sql.Append($"select id,其它列 from 表 where id>{last_id} order by id limit {limit} ");MySqlCommand cmd = new MySqlCommand(sql.ToString(), mySqlTools.connection);MySqlDataReader reader = cmd.ExecuteReader();int current_count = 0;try{while (reader.Read()){if (total_records < 10){ListViewItem item = listView_1.Items.Add(reader[0].ToString());item.SubItems.Add(reader[1].ToString());item.SubItems.Add(reader[2].ToString());item.SubItems.Add(reader[3].ToString());}last_id = reader.GetInt32(0);++current_count;++total_records;}reader.Close();}catch (Exception ex){MessageBox.Show($"limit {limit},将减半 已获取数据{total_records}条", "limit");limit /= 2;}if (0 == current_count) break;}MessageBox.Show($"记录 {total_records} 最终limit {limit}", "总数");

        我这个代码原来不用分段就行,后来数据量太大了,超过30秒就被断开连接了。

        查询按照id顺序,因此记住上一个id就可以继续查询。


(这里是文档结束) 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【machine learning-十-梯度下降-学习率】
  • node.js+Koa框架+MySQL实现注册登录
  • “科学突破奖”获得者连续两篇Nature,成功绘制人类主要激酶底物特异性图谱
  • 字符串函数的使用与模拟(2)——C语言内存函数
  • Leetcode 165. 比较版本号(Medium)
  • 【C++】——多态详解
  • 新电脑工作流搭建记录-前端篇
  • Nginx从入门到入土(三): 静态资源管理与代理服务
  • 腾讯云2024年数字生态大会开发者嘉年华(数据库动手实验)TDSQL-C初体验
  • npm 安装 与 切换 淘宝镜像
  • 使用 SpringBoot 基础web开发的支持
  • RT-DETR改进策略:BackBone改进|Next-ViT主干赋能下的革命性改进
  • 解决最短路径问题
  • HarmonyOS axios 拦截器处理token 及异常
  • vue websocket 使用
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CentOS6 编译安装 redis-3.2.3
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • crontab执行失败的多种原因
  • ES6 学习笔记(一)let,const和解构赋值
  • gitlab-ci配置详解(一)
  • Java Agent 学习笔记
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Logstash 参考指南(目录)
  • php的插入排序,通过双层for循环
  • Python学习之路16-使用API
  • web标准化(下)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从重复到重用
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 欢迎参加第二届中国游戏开发者大会
  • 区块链将重新定义世界
  • 手机端车牌号码键盘的vue组件
  • 跳前端坑前,先看看这个!!
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​浅谈 Linux 中的 core dump 分析方法
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (0)Nginx 功能特性
  • (5)STL算法之复制
  • (C)一些题4
  • (Qt) 默认QtWidget应用包含什么?
  • (六)软件测试分工
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (小白学Java)Java简介和基本配置
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Framework .NET Core与 .NET 的区别
  • .Net IOC框架入门之一 Unity
  • .net 简单实现MD5
  • .NET 设计模式初探
  • .NET单元测试
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET上SQLite的连接