文章851
标签121
分类10

MySQL 优化器参数derived_merge导致多表关联SQL性能及其低下

最近,MySQL维护中,遇到一个问题,通条SQL语句,在mysql 5.6的测试环境中执行速度不到1秒,但是在

mysql 5.7生产环境中执行却要近5分钟,mysql 5.7中同样的数据库同样的数据量,更新完表的统计信息后执行

速度还是要2分钟。本次问题的处理与sql语句本身没有关系,只跟mysql数据库自身的优化器参数相关,下面是

问题的分析排查过程,问题分析中的sql语句不需要显示,可以明确sql是多表join连接并且业务不允许更改。

1、首先,查看测试环境和生产环境中,mysql的sql语句的执行计划

--测试环境,执行计划只需显示局部能说明问题即可

Xnip2024-03-29_21-50-53.png

--生产环境,执行计划只需显示局部能说明问题即可

Xnip2024-03-29_21-51-24.png

2、从测试与生产环境sql语句的对比可以明显发现,sql的执行计划不一致,后续排查中发现

a、测试环境中sql涉及的表和索引的统计信息都是当天最新的,而生产环境中的相关表和索引的统计信息比较陈旧
b、测试环境 mysql大版本为5.6,生产环境mysql大版本为5.7

3、问题处理

a、由于sql执行计划不一致,且生产环境统计信息比较旧,重新收集生产环境表的统计信息,收集后sql的执行速度没有

提高,相比测试依然很慢。

b、关注测试环境执行计划derived和<auto_key>,该特性与mysql 的参数derived_merge相关,查看该参数的设置情况

--测试环境

MySQL [(none)]> show global variables like '%switch%';
+------------------+------------------------------------------------------------------------------+
| Variable_name    | Value                                                                        |                                                                                                                                                                                                                                                                                                    
+------------------+------------------------------------------------------------------------------+
| optimizer_switch | index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,....... |
+------------------+------------------------------------------------------------------------------+

1 row in set (0.00 sec)

MySQL [(none)]> 

--生产环境,为了方便说明问题,省略了多余的参数显示

mysql> show  variables like '%switch%';
+------------------+-----------------------------+
| Variable_name    | Value                       |                                                                                                                                                                                                                                                                                                                                                                                   
+------------------+-----------------------------+
| optimizer_switch | ......, derived_merge=on    |
+------------------+-----------------------------+

1 row in set (0.00 sec)

mysql>

c、根据官方说明参数derived_merge是在mysql5.7版本中引入的,作用就是对join (select)表连接合并,本次问题sql有

大量的join (select),导致sql执行结果集合并,sql执行速度及其缓慢。

d、通过session级别临时取消该参数,观察sql执行计划,发现sql执行计划正常,且sql执行速度不到1秒与测试环境相近

--取消优化器derived_merge参数

mysql> set optimizer_switch="derived_merge=off";

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:    8980

Current database: mysql

Query OK, 0 rows affected (0.02 sec)

mysql> 

--观察问题sql执行计划,此时生产环境执行计划与测试环境相同

Xnip2024-03-29_21-55-40.png

--问题sql执行速度由原先的近5分钟到现在的1秒左右

PHP - 将GD图像转换回二进制数据

我有一个从imagecreatefromstring创建的GD图像资源。经过一些图像操作后,我想将其转换回二进制数据。我该怎么做?手册中看不到任何功能...

最佳答案

使用imagejpegimagepng或类似的名称。如果要将结果转储到字符串而不是文件中,请使用output buffering:

ob_start();
imagejpeg($im);
$image_string = ob_get_contents();
ob_end_flush();

关于php - 将GD图像转换回二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2207865/

Mysql 更新记录报错"Truncated incorrect DOUBLE value: 'CC2C3872-25E2-4ABB-BE24-7A293DB4BD3E'"

解决MySQL更新记录报错"Truncated incorrect DOUBLE value: 'CC2C3872-25E2-4ABB-BE24-7A293DB4BD3E'"

在MySQL数据库中,当执行更新记录的操作时,有时候会遇到类似于"Truncated incorrect DOUBLE value"的错误。本文将探讨这个错误的原因,并提供一些解决方案。

1. 错误原因

这个错误通常发生在以下情况下:

  • 在更新操作中,目标列的数据类型是DOUBLE或FLOAT。
  • 更新语句中的值是带有非数字字符的字符串,例如'CC2C3872-25E2-4ABB-BE24-7A293DB4BD3E'。

MySQL在这种情况下会尝试将字符串转换为DOUBLE或FLOAT类型的值,但由于字符串中包含非数字字符,导致转换失败并报错。

2. 解决方案

为了解决"Truncated incorrect DOUBLE value"错误,可以考虑以下解决方案:

  • 检查数据类型:检查目标列的数据类型是否正确。如果目标列应该存储字符串类型的值,而被错误地定义为DOUBLE或FLOAT类型,则需要修改目标列的数据类型为适当的字符串类型,例如VARCHAR。
  • 验证输入值:在执行更新操作之前,应该验证输入值的格式和类型。如果输入值是字符串类型的,确保它符合目标列所需的格式要求。如果需要将字符串值转换为数值类型,可以使用合适的转换函数,例如CAST或CONVERT函数。
  • 使用引号:如果目标列的数据类型是字符串类型,确保在更新语句中的字符串值使用引号括起来,以避免将其解释为数值类型。

参考文献

以下是一些相关的参考文献,供进一步学习和了解:

  1. Oracle, "12.2 Type Conversion in Expression Evaluation," MySQL 8.0 Reference Manual, 2021. [Online]. Available: https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html.
  2. S. K. Singh, "Effective Techniques to Handle MySQL Errors and Exceptions," International Journal of Advanced Research in Computer Science and Software Engineering, vol. 9, no. 7, pp. 150-153, July 2019.

结论

MySQL更新记录报错"Truncated incorrect DOUBLE value"通常是由于目标列的数据类型定义错误或输入值与目标列的数据类型不匹配所导致的。为了解决这个问题,可以检查数据类型的定义,验证输入值的格式和类型,并在更新语句中使用引号来明确指示字符串类型。

WebSocket是什么

WebSocket:实时双向通信的协议

WebSocket是一种在Web应用程序中实现实时双向通信的协议。它提供了一种持久化的连接,允许客户端和服务器之间进行全双工通信,从而实现实时数据交换。本文将介绍WebSocket的基本原理、优势以及在Web开发中的应用。

1. WebSocket的基本原理

WebSocket协议建立在传输层协议(如TCP)之上,通过在客户端和服务器之间建立一条持久化的连接,实现双向通信。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端发送数据,而不需要客户端发起请求。

在建立WebSocket连接时,客户端和服务器通过进行一次特殊的握手过程来协商连接的建立。一旦连接建立成功,双方就可以通过发送消息来进行实时的双向通信。这种持久化的连接减少了通信的延迟,并且可以更高效地传输实时数据。

2. WebSocket的优势

相比传统的HTTP请求-响应模型,WebSocket具有以下优势:

  • 实时性和效率:WebSocket提供了实时的双向通信,服务器可以主动向客户端推送数据,避免了频繁的轮询或长轮询的开销,提供更高效的数据传输和实时性。
  • 更少的通信开销:由于WebSocket建立了持久化的连接,避免了每次通信都需要建立和关闭连接的开销,减少了通信的开销和网络流量。
  • 更低的延迟:WebSocket通过减少通信的延迟,实现了更低的响应时间,使得实时应用程序(如聊天应用、股票行情等)能够更快地响应和更新数据。

3. WebSocket的应用

WebSocket在Web开发中有广泛的应用,特别是在需要实时数据交换的场景。以下是一些常见的应用领域:

  • 实时聊天和通信:通过WebSocket可以实现实时聊天和通信应用,允许用户即时发送和接收消息,提供更好的用户体验。
  • 实时数据更新:WebSocket可以用于实时更新数据,例如股票行情、实时地图、协作编辑等应用,使得用户可以及时获得最新的数据。
  • 实时游戏:WebSocket可以用于实时多人游戏,实现实时的游戏状态同步和交互。

参考文献

以下是一些相关的参考文献,供进一步学习和了解:

  1. I. Fette, A. Melnikov, "The WebSocket Protocol," RFC 6455, 2011. [Online]. Available: https://datatracker.ietf.org/doc/html/rfc6455.
  2. M. Sambasivan, "WebSockets vs. HTTP/2: A Performance Comparison," 2019. [Online]. Available: https://www.section.io/engineering-education/websockets-vs-http2-performance-comparison/.

结论

WebSocket是一种在Web应用程序中实现实时双向通信的协议。它通过建立持久化的连接,允许服务器主动向客户端推送数据,提供了实时性、效率和更低的延迟。WebSocket在实时聊天、实时数据更新以及实时游戏等应用中有着广泛的应用。

Docker镜像与容器:有什么区别?

本文将探讨Docker镜像和容器之间的差异,帮助您了解如何以及何时使用它们。
Docker容器化平台有助于使用容器轻松创建、部署和运行应用程序。如果您是Docker新手,您可能想知道Docker映像与Docker容器有何不同。尽管Docker镜像和容器具有相似的目的,但它们有不同的用途。镜像是环境的快照,容器运行软件。将容器视为软件的运输容器-它保存文件和程序等重要内容,以便应用程序可以有效地从生产者交付给消费者。

Docker概述

DockerFlatpakSnaps等解决方案都有相同的目标,即将应用程序打包到单个捆绑包中以安装在任何Linux发行版中。

SolomonHykes2013年将Docker作为一个开源项目推出。他们的第一个商业版本已于2014年准备投入生产。

容器化的最大好处之一是,它使开发人员能够将其应用程序与在任何Linux发行版上运行所需的所有依赖项打包在一起。这样就无需手动安装每个依赖项。

多个容器可以同时运行,每个容器都基于相同或不同的映像。Docker在创建操作系统的多个实例方面与虚拟机类似。但是,Docker允许您创建在同一操作系统上运行的容器。因此,在给定的硬件组合上可以运行比虚拟机更多的容器。

Docker容器甚至可以在虚拟机中运行。与创建虚拟机相比,Docker提供了额外的抽象和自动化层,使其更易于使用。

容器化平台在开发人员和系统管理员中越来越受欢迎,因为它包含应用程序的完整文件系统及其所有依赖项。此设置支持不可变的基础架构并保证部署是幂等的-无论您重复操作多少次,它们都将保持完全相同。

Docker守护进程在后台运行以管理映像、容器等。客户端和守护程序使用套接字或通过RESTfulAPI进行通信。

Xnip2024-02-20_10-56-18.png

什么是Docker镜像?

图像是只读模板,包含创建容器的说明。Docker镜像创建在Docker平台上运行的容器。

将图像想象成容器运行时内容的蓝图或快照。

图像由多个堆叠层组成,就像照片编辑器中的层一样,每个层都会改变环境中的某些内容。映像包含运行应用程序的代码或二进制文件、运行时、依赖项和其他文件系统对象。该映像依赖于主机操作系统(OS)内核。

例如,要构建Web服务器映像,请从包含UbuntuLinux(基本操作系统)的映像开始。然后,在上面添加Apache和PHP等软件包。

您可以使用Dockerfile手动构建映像,Dockerfile是一个包含创建Docker映像的所有命令的文本文档。您还可以使用命令从称为注册表的中央存储库或DockerHub等存储库中提取映像dockerpull[name]

Docker用户运行一个镜像时,它会成为一个或多个容器实例。容器的初始状态可以是开发人员想要的任何状态——它可能有一个已安装和配置的Web服务器,或者只有一个以root身份运行的bashshell。但实际上,大多数映像都包含一些预配置的软件和配置文件。

Docker镜像是不可变的,因此一旦创建就无法更改。如果您需要更改某些内容,请使用您的更改创建另一个容器,然后将其另存为另一个图像。或者,只需使用现有映像作为基础来运行新容器并更改该容器即可。

成功构建应用程序后,Docker可以进一步将镜像导出到其他镜像中。彼此派生的图像通常称为父图像和子图像。

一张图片可能有多个标签,但每个标签都是唯一的。标签区分图像,例如ubuntu:latestubuntu:14.04

映像本身并不运行,但您可以从Docker映像创建并运行容器。

什么是容器?

容器是一个隔离的地方,应用程序在其中运行,不会影响系统的其余部分,也不会让系统影响应用程序。由于容器是隔离的,因此非常适合安全运行的软件,例如数据库或Web应用程序,这些软件需要访问敏感资源,而无需向系统上的每个用户授予访问权限。

由于容器在Linux上本机运行并共享主机的内核,因此它是轻量级的,不会比其他可执行文件使用更多的内存。如果您停止容器,它不会自动重新启动,除非您以这种方式配置它。然而,容器比虚拟机更高效,因为它们不需要整个操作系统的开销。它们与其他容器共享单个内核,并在几秒钟而不是几分钟内启动。

您可以使用容器将应用程序及其所需的所有组件打包,然后将其作为一个单元全部发送出去。这种方法很受欢迎,因为它消除了开发、质量保证和生产环境之间的摩擦,从而实现了更快的软件交付。在软件容器内构建和部署应用程序可以消除与其他开发人员协作编写代码时“在我的机器上运行”的问题。

这些应用程序还可以在任何基础设施和任何云中运行。您可以将应用程序及其底层基础设施与其他应用程序隔离。

Docker镜像与容器

Docker镜像在Docker容器中执行代码。您可以在Docker映像上添加核心功能的可写层来创建正在运行的容器。

Docker容器视为正在运行的映像实例。您可以从同一个映像创建许多容器,每个容器都有自己独特的数据和状态。

虽然镜像不是创建容器的唯一方式,但却是一种常用的方法。

采用容器的一个主要好处是开发、操作和测试的标准化和简化。然而,为了让团队充分利用容器,他们需要确保开发人员、运营工程师和测试人员创建一致的环境。

持续集成和持续部署(CI/CD)管道可以构建、测试和打包容器。然后,部署将该容器分发到运行时环境,在该环境中它可以作为应用程序的一部分执行。

结论

容器和镜像都允许用户指定应用程序依赖项和配置,并描述机器运行该应用程序所需的一切。然而,容器和镜像有不同的生命周期。例如,您可以在PivotalCloudFoundry等基于容器的系统上使用容器,但不能使用映像。同样,您可以在HerokuOpenShift等非容器系统中使用映像,但不能使用容器。

这不是选择容器或图像的问题。它们相互依赖,并且您需要两者都与Docker一起工作。

现在您已经了解了Docker映像容器之间的细微差别,您可以充分利用Docker平台。使用Docker时,自动化可帮助您快速集成并释放开发人员时间来创建新的应用程序功能。

转载请注明出处:https://www.cloudnative-tech.com/introduction/5996.html
">