Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
MySQL 之 SQL 优化实战记录_创想鸟

MySQL 之 SQL 优化实战记录

针对java web中的表格查询进行的sql优化,背景是多个机台将数据发送到服务器,服务器将数据存储在mysql数据库中,并通过java web程序展示给用户。以下是对原文章的伪原创处理:

背景

本次SQL优化是针对Java Web应用中表格查询功能进行的。多个机台将业务数据传输到服务器端,服务器程序将这些数据存储到MySQL数据库中。接着,Java Web应用通过读取数据库中的数据,将其展示在网页上供用户查看。

部分网络架构图MySQL 之 SQL 优化实战记录

业务简介

多个机台将业务数据发送到服务器,服务器程序将这些数据存储到MySQL数据库中。Java Web程序从数据库中读取数据并在网页上展示给用户。

原数据库设计

数据库采用Windows单机主从分离的架构,已进行分表分库处理,按年份分库,按天分表。每张表大约包含20万条数据。原查询效率为3天数据查询需70-80秒。

目标

优化目标是将3天数据查询时间缩短至3-5秒。

业务缺陷

由于业务限制,无法使用SQL分页,只能通过Java进行分页处理。

问题排查

为了确定是前端还是后端导致查询慢,如果配置了Druid,可以在其页面直接查看SQL执行时间和URI请求时间。也可以在后台代码中使用System.currentTimeMillis计算时间差。结论是后台执行慢,且SQL查询速度慢。

SQL问题分析

原SQL语句拼接过长,达到3000行甚至8000行,大部分是通过UNION ALL操作连接的,并且存在不必要的嵌套查询和查询了不必要的字段。使用EXPLAIN查看执行计划,发现除了时间条件外,WHERE条件中只有一个字段使用了索引。备注:由于优化后无法找到原SQL,这里只能进行假设分析。

查询优化

去除不必要的字段:效果不明显。去除不必要的嵌套查询:效果不明显。分解SQL:将UNION ALL操作分解为多个SQL语句执行,最后汇总数据。这种方法使查询速度提高了约20秒。

例如,将如下SQL分解:

select aa from bb_2018_10_01 left join ... on .. left join .. on .. where .. union allselect aa from bb_2018_10_02 left join ... on .. left join .. on .. where .. union allselect aa from bb_2018_10_03 left join ... on .. left join .. on .. where .. union allselect aa from bb_2018_10_04 left join ... on .. left join .. on .. where ..

分解为:

select aa from bb_2018_10_01 left join ... on .. left join .. on .. where ..

异步执行分解的SQL:使用Java的异步编程功能,将分解后的SQL语句异步执行并最终汇总数据。这里使用了CountDownLatch和ExecutorService,示例代码如下:

// 获取时间段所有天数List days = MyDateUtils.getDays(requestParams.getStartTime(), requestParams.getEndTime());// 天数长度int length = days.size();// 初始化合并集合,并指定大小,防止数组越界List list = Lists.newArrayListWithCapacity(length);// 初始化线程池ExecutorService pool = Executors.newFixedThreadPool(length);// 初始化计数器CountDownLatch latch = new CountDownLatch(length);// 查询每天的时间并合并for (String day : days) {    Map param = Maps.newHashMap();    // param 组装查询条件    pool.submit(new Runnable() {        @Override        public void run() {            try {                // mybatis查询sql                // 将结果汇总                list.addAll(查询结果);            } catch (Exception e) {                logger.error("getTime异常", e);            } finally {                latch.countDown();            }        }    });}try {    // 等待所有查询结束    latch.await();} catch (InterruptedException e) {    e.printStackTrace();}// list为汇总集合// 如果有必要,可以组装下你想要的业务数据,计算什么的,如果没有就没了

这种方法使查询速度再次提高了20-30秒。

优化MySQL配置

以下是优化MySQL配置的示例。添加了skip-name-resolve配置后,查询速度提高了4-5秒。其它配置可根据具体情况进行调整。

[client]port=3306

[mysql]no-beepdefault-character-set=utf8

[mysqld]server-id=2relay-log-index=slave-relay-bin.indexrelay-log=slave-relay-binslave-skip-errors=all #跳过所有错误skip-name-resolveport=3306datadir="D:/mysql-slave/data"character-set-server=utf8default-storage-engine=INNODBsql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"log-output=FILEgeneral-log=0general_log_file="WINDOWS-8E8V2OD.log"slow-query-log=1slow_query_log_file="WINDOWS-8E8V2OD-slow.log"long_query_time=10

Binary Logging.

log-bin

Error Logging.

log-error="WINDOWS-8E8V2OD.err"

整个数据库最大连接(用户)数

max_connections=1000

每个客户端连接最大的错误允许数量

max_connect_errors=100

表描述符缓存大小,可减少文件打开/关闭次数

table_open_cache=2000

服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)

每个连接独立的大小.大小动态增加

max_allowed_packet=64M

在排序发生时由每个线程分配

sort_buffer_size=8M

喵记多
喵记多

喵记多 - 自带助理的 AI 笔记

喵记多 27
查看详情 喵记多

当全联合发生时,在每个线程中分配

join_buffer_size=8M

cache中保留多少线程用于重用

thread_cache_size=128

此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.

thread_concurrency=64

查询缓存

query_cache_size=128M

只有小于此设定值的结果才会被缓冲

此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖

query_cache_limit=2M

InnoDB使用一个缓冲池来保存索引和原始数据

这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.

在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%

不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.

innodb_buffer_pool_size=1G

用来同步IO操作的IO线程的数量

此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.

innodb_read_io_threads=16innodb_write_io_threads=16

在InnoDb核心内的允许线程数量.

最优值依赖于应用程序,硬件以及操作系统的调度方式.

过高的值可能导致线程的互斥颠簸.

innodb_thread_concurrency=9

0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.

1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上

2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上

innodb_flush_log_at_trx_commit=2

用来缓冲日志数据的缓冲区的大小.

innodb_log_buffer_size=16M

在日志组中每个日志文件的大小.

innodb_log_file_size=48M

在日志组中的文件总数.

innodb_log_files_in_group=3

在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.

InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.

如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎

那么一个死锁可能发生而InnoDB无法注意到.

这种情况下这个timeout值对于解决这种问题就非常有帮助.

innodb_lock_wait_timeout=30

开启定时

event_scheduler=ON

根据业务需求,添加筛选条件后,查询速度又提高了4-5秒。

索引优化

建立联合索引:将WHERE条件中除时间条件外的字段建立联合索引,效果不明显。使用INNER JOIN:将WHERE条件中的索引条件使用INNER JOIN方式进行关联。原SQL中b为索引字段:

select aa from bb_2018_10_02 left join ... on .. left join .. on .. where b = 'xxx'

修改为:

select aa from bb_2018_10_02 left join ... on .. left join .. on .. inner join(select 'xxx1' as b2union allselect 'xxx2' as b2union allselect 'xxx3' as b2union allselect 'xxx3' as b2) t on b = t.b2

这种方法使查询速度提高了3-4秒。

性能瓶颈

经过上述优化,3天数据查询效率已经达到约8秒,但无法进一步提升。检查MySQL的CPU使用率和内存使用率均不高,3天数据最多60万条,关联的都是一些字典表,不应如此慢。尝试各种网上提供的方法,基本无效。

环境对比

由于SQL优化已完成,考虑可能是磁盘读写问题。将优化后的程序部署在不同的现场环境中,其中一个环境使用SSD,另一个使用普通机械硬盘。发现查询效率差异显著。使用软件检测发现SSD的读写速度为700-800M/s,而普通机械硬盘的读写速度为70-80M/s。

优化结果及结论

优化结果:达到了预期目标。

优化结论:SQL优化不仅仅是对SQL本身的优化,还取决于硬件条件、其他应用的影响以及自身代码的优化。

小结

优化的过程是一个自我提升和挑战的机会,珍惜这样的机会,不要只做写业务代码的程序员。希望以上内容能对你的思考有所帮助,欢迎指出不足之处。

以上就是MySQL 之 SQL 优化实战记录的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/436039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VSCode的疑难解答功能在哪里?
上一篇 2025年11月7日 16:14:48
Win11 WSA 已正式画上句号,微软商店下架相关应用
下一篇 2025年11月7日 16:14:53

相关推荐

  • VSCode配置GDB调试器 深入掌握VSCode调试C程序技巧

    配置vscode中gdb调试c程序的核心是正确设置tasks.json和launch.json;2. tasks.json负责使用gcc -g编译生成带调试信息的可执行文件,确保prelaunchtask与launch.json中的program路径一致;3. launch.json指定调试器gdb…

    2026年9月22日
    100
  • java定时任务之quartz

    大家好,很高兴再次与大家见面,我是你们的朋友全栈君。 一、Quartz简介 在企业应用中,我们常常需要处理定时任务调度,比如每天凌晨生成前一天的报表,每小时生成一次汇总数据等。Quartz是一个著名的任务调度框架,它可以与J2SE和J2EE应用结合,功能非常强大,易于与Spring集成,使用起来非常…

    2026年9月22日
    100
  • Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    sublime可通过插件实现与mysql联动监控触发器日志写入。具体步骤如下:1.安装package control、mysql语法高亮、构建系统等插件;2.创建日志表并编写触发器记录数据变更;3.配置.sublime-build文件调用mysql命令行执行sql脚本;4.使用快捷键提升日志查询和处…

    2026年9月22日 用户投稿
    000
  • Java中异常处理与方法返回值结合

    异常发生时不应返回默认值,而应通过抛出异常或使用Optional、自定义结果类等方式明确传递错误信息,确保调用方能正确处理失败情况,提升代码健壮性与可读性。 在Java中,异常处理与方法返回值的结合是一个常见的编程问题。理解它们之间的关系有助于写出更健壮、可读性更强的代码。当一个方法可能发生异常时,…

    2026年9月22日
    000
  • tk做养生类目起号前期发什么视频?tk表示什么类目?

    在TikTok上运营养生类账号,起号阶段的内容策略尤为关键。优质的内容不仅能快速吸引目标用户,还能为后续发展奠定良好基础。本文将深入解析初期应发布的视频类型,并澄清“TK”所指的平台属性及内容分类体系。 一、养生类目起号初期适合发布哪些视频内容? 刚开始做养生赛道时,重点不在于变现,而在于建立专业形…

    2026年9月22日
    000
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • 华为天际通Go将支持eSIM:设备在路上了

    华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了

    9月3日消息,今年的iphone 17 air将仅支持esim,彻底移除实体sim卡槽结构。随着新品发布日期的临近,国内esim政策的进展也愈发引人关注。 然而综合多方信息来看,iPhone 17 Air国行版本可能无法赶上首发,因前期在国内无法使用eSIM服务,导致该机型短期内难以在国内上市。 相…

    2026年9月22日 用户投稿
    000
  • ThinkPad电脑黑屏无显示如何解决?商务本常见问题修复教程

    ThinkPad黑屏但风扇转时,先做强制断电放电,再接外显测试;若有显示则为屏幕或排线问题,否则查内存、显卡等内部硬件,逐步深入排查可定位故障。 ThinkPad电脑突然黑屏无显示,这事儿搁谁身上都挺糟心的,尤其是那些把笔记本当命根子的商务人士。别慌,经验告诉我,很多时候它没你想的那么严重,往往是一…

    2026年9月22日
    000
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    000
  • windows11系统还原点怎么创建和使用_windows11创建和使用还原点教程

    windows11系统还原点怎么创建和使用_windows11创建和使用还原点教程windows11系统还原点怎么创建和使用_windows11创建和使用还原点教程windows11系统还原点怎么创建和使用_windows11创建和使用还原点教程windows11系统还原点怎么创建和使用_windows11创建和使用还原点教程

    创建系统还原点可有效保护系统安全。首先启用系统保护功能,进入“系统属性”→“系统保护”选项卡,选择C盘并配置启用,设置5%-10%磁盘空间;随后点击“创建”按钮,输入描述性名称如“安装大型软件前备份”,完成还原点创建;可通过“系统还原”向导查看已创建的还原点,确认其存在及详细信息;当系统异常时,在相…

    2026年9月22日 用户投稿
    100
  • 如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    PhotoLab的AI裁剪功能通过智能识别主体与构图原则,提供优化裁剪建议,区别于传统手动裁剪的纯物理操作,能自动应用美学法则提升照片视觉吸引力;在人像、社交媒体适配、风景静物等场景中表现突出,尤其擅长保留核心焦点并适配多平台比例;用户可导入图片后使用AI裁剪工具,系统分析画面并生成建议裁剪框,支持…

    2026年9月22日 用户投稿
    000
  • MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    access denied错误需检查用户名密码及权限,使用grant授权并执行flush privileges;2. can’t connect错误应确认mysql运行状态、防火墙设置及bind-address配置;3. host not allowed错误需创建用户并授权特定或全部ip…

    2026年9月22日 用户投稿
    000
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    000
  • VSCode如何实现代码可视化调试 VSCode执行流程图形化分析方法

    vscode的可视化调试功能通过内置调试器和扩展生态,显著提升代码理解与问题排查效率。1. 首先配置launch.json文件以定义调试环境,支持多种语言如node.js、python等;2. 在代码中设置断点,程序运行至断点时暂停,便于检查变量状态和执行上下文;3. 利用调试面板查看变量、监视表达…

    2026年9月22日
    000
  • win11外接显示器检测不到怎么办_win11外接显示器无法识别修复方法

    首先检查连接线和接口是否正常,确保外接显示器被正确识别;接着在显示设置中点击“检测”按钮手动搜索显示器;若无效则更新或重装显卡驱动;再进入BIOS确认外部显示功能已启用,并更新系统固件;最后通过重置显示设置恢复默认配置以解决识别问题。 如果您尝试将外部显示器连接到Windows 11设备,但系统无法…

    2026年9月22日
    100
  • MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    mysql备份压缩与加密的核心在于减少存储空间并提升数据安全性。1. 压缩能显著降低存储成本,提升传输效率,加快恢复速度,简化备份管理,并有助于满足合规要求;2. 加密则通过防止未授权访问保障数据安全。实现方式主要有:1. 使用mysqldump结合gzip和gpg/openssl进行逻辑备份、压缩…

    2026年9月22日 用户投稿
    100
  • VS Code中Dockerized PHP项目:解决PHP版本冲突的教程

    本教程旨在解决在VS Code中开发Dockerized PHP项目时,VS Code默认识别宿主机PHP版本而非容器内PHP版本的问题。核心解决方案是利用VS Code的Remote – Containers扩展,实现直接在Docker容器内部进行代码开发,从而确保VS Code及其所…

    2026年9月22日
    200
  • 蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!

    蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!

    PConline最新资讯,vivo于今晚正式揭晓X300系列新机,定位“全焦段影像旗舰”,起售价为4399元。该系列成为首款搭载联发科天玑9500芯片的智能手机,并携手三星与索尼共同定制多颗影像传感器,在影像能力、屏幕素质及续航表现上力求全面跃升。 产品线涵盖X300与X300 Pro两款机型,价格…

    2026年9月22日 用户投稿
    000
  • 从AI场景搭建到蝴蝶号运营,全流程实战攻略

    从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略

    做ai内容变现需先明确方向再选工具,注册蝴蝶号要模拟真实行为,用ai提升效率但需调整内容细节,流量转化重于播放量。一、先确定内容类型和风格,根据方向选择合适ai工具链搭建流程,用免费api测试效果。二、蝴蝶号注册尽量用企业主体,资料完整,养号阶段关注同类账号,保持每天发布1~2条内容,视频控制在30…

    2026年9月22日 用户投稿
    100
  • GIMP中如何利用AI裁剪图片?一步步完成高效图像裁剪方法

    GIMP虽无“一键AI裁剪”功能,但可通过智能选择工具(如前景选择、智能剪刀)精准选中主体,结合Resynthesizer插件的内容感知填充实现类AI裁剪效果;对于更高要求,可协同Remove.bg等外部AI工具完成自动抠图,再导入GIMP进行裁剪或背景替换,形成高效智能裁剪工作流。 ☞☞☞AI 智…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信