网站用阿里云mysql速度慢_改用RDS后为什么数据库变慢?

news/2024/5/12 21:06:42/文章来源:https://blog.csdn.net/weixin_39590566/article/details/114041911

为什么我的RDS 突然变慢了?相信不少客户在使用RDS 中经常遇到的头疼问题。下面我将通过真实案例来分析一下用户在使用RDS 中慢的原因:

案例一:用户从PGSQL迁移到RDS后,发现RDS变慢了。

问题描述:用户的数据库(pgsql)迁移到RDS(mysql)后,发现相同的一条sql 语句,数据量百万级左右,在原来postgreSQL 中执行大概是0.015s,而在RDS 下直接运行是6分20秒左右,执行非常的慢,已经严重的影响了用户使用RDS 使用的信心。

可能原因:为什么在用户的数据库上执行只需要0.015s,而到RDS 后变为了6分20s?根据经验,很有可能是SQL 的执行计划改变了,而导致执行时间剧增。

问题排查:通过explain 查看sql 的执行计划,一步一步进行优化。

9584f0521944881fbb3c48e5df75235a.png

通过分析,我们可以从执行计划上分析b 表做了一个全表扫描(执行计划的最后一行),查看b 表中tid 并无索引,所以我们这里可以进行优化,来减少查询过程中关联的行数,来达到优化:

b2572e74e815ed57a9581bcb56beef0d.png

---------------------------------------------------------------------------------------------------------------------

8cb779f9ad32605a37db2d2511943556.png

我们可以看到执行计划中的rows 已经从452变为了2(执行计划的最后一行),

由于mysql 表关联只有nest loop join 这种算法,所以我们可以估算一下这里的优化:

原始执行一:1055789*1*1*1*1*452 扫描的行数

新执行计划二:1055789*1*1*1*1*2 扫描的行数

执行时间:

1d86fe37852c77e81c9438d08d46a23a.png

我们看到执行时间已经由原来的6分20秒下降到了10秒,我们继续优化;

可以看到该sql 的结果集只有区区的8行,但是扫描的行数却是非常之大的(1055789*1*1*1*1*2),在优化sql 的非常关键的一点就是优化sql 的执行路程,t=s/v;如果我们能够优化S,那么速度肯定会一下子提上来; 那么我们在看看sql 中最后的一句:

-> WHERE EXISTS

-> (SELECT 1 FROM xxxx_test5 b WHERE a.tid = b.tid);

sql 查询中是要查询出每笔订单的详细信息而不得不关联其他一些表,但是最后的一个exist 限定了我们最后结果的范围,在看看xxxx_test5 这张表有多大:

mysql> SELECT COUNT(*) FROM xxxx_test5;

+----------+

| COUNT(*) |

+----------+

| 403 |

+----------+

1 ROW IN SET (0.00 sec)

mysql> SELECT COUNT(*) FROM xxxx_test5 b ,xxxx_test a WHERE

a.tid = b.tid ;

+----------+

| COUNT(*) |

+----------+

| 8 |

+----------+

1 ROW IN SET (0.42 sec)

两张表关联后只有8行记录,如果我们将订单表xxxx_test 和限定表先做关联,在和其他的一些订单信息表做连接,将会极大减小关联的行数;在进一步改写sql:

642d7a7cf1752faecab3a114b2346775.png

分析执行计划,我们发现限定表xxxx_test5做了驱动表,驱动表的变化才是导致问题的最根本原因,扫描的行数:452*1*1*1*1; 这个时候sql 的执行速度就飞一般感觉了:

Mysql-->;

SELECT a.oi.............

........省去结果

8 ROWS IN SET (0.13 sec)

总结:由于环境迁移,导致sql 执行计划改变,这就是RDS 变慢的最终原因了。

案例二:用户使用RDS(mssql),经常出现连接超时报错

问题描述: 使用mssql rds 时不时报错如下,询问是否是连接超过限制导致的?

A network-related orinstance-specific error occurred while establishing a connection toSQL Server. The server was not found or was not accessible. Verifythat the instance name is correct and that SQL Server is configured toallow remote connections. (provider: SQL Network Interfaces, error:26 – Error Locating Server/Instance Specified)

可能原因:可能用户的应用程序设计不是很好导致数据库锁争用较多;或由于没有建立适当的索引导致全表扫描导致,造成了数据库等待;

问题排查:通过查看数据库的监控指标,发现在某个时间段有大量的全表扫描,同时数据库的锁争超时,会话数明显增加。

a42cc1ee82c40dd53b1c94a156d0d19a.png

---------------------------------------------------

b3cef166fea90baef643135f55f9bb8a.png

可以看到在15:00的时候有大量的全表扫描,出现了较多的锁超时的情况,同时这个时候也有大量的会话在数据库中,而这个时间恰好也是用户报出错误的时间,在进一步排查,用户的SQL,通过查看mssql 内部的一些视图,来找到对应消耗资源top 5的sql,发现用户使用频繁的查询一个视图,在视图中有多表连接,但在这些表连接中的字段上没有添加索引,导致了全表扫描,用户视图如下:

CREATE VIEW [dbo].[Vi_xxx]

AS

SELECT ..........

..........

FROM dbo.xxxx_test6 INNER JOIN

dbo.xxxx_test1 ON dbo.xxxx_test5.docID = dbo.xxxx_test1.docID

INNER JOIN

dbo.xxxx_test2 ON dbo.xxxx_test5.typeID = dbo.xxxx_test2.typeID

INNER JOIN

dbo.xxxx_test3 ON dbo.xxxx_test5.docID = dbo.xxxx_test3.docID

INNER JOIN

dbo.xxxx_test4 ON dbo.xxxx_test5.categoryID =

dbo.xxxx_test4.categoryID

WHERE (dbo.xxxx_test5.isDelete = 0)

通过查看执行计划,发现表上面很多的关联字段没有建立索引,导致全表扫描执行计划如下(有很多的table scan):

2a160b4ceee36fdb74a48b4a4898fd4c.png

总结:用户频繁的查询一个视图,而该视图中表的关联字段上没有索引,导致了大量的全表扫描,累积了大量的会话数,造成数据库性能的下降,应用与数据库之间出现连接错误。

案例三:隐式转换导致全表扫描

问题描述:用户网站打开缓慢,质疑RDS 性能不好。

可能原因:用户的数据存放在RDS 中,网站访问数据库的时间较长,大多web应用程序设计,SQL没有优化或索引建立的不好导致;

问题排查:通过查看数据库的慢日志,发现大量的慢sql,执行时间超过了2S。

UPDATE USER SET xx=xx+N.N WHERE

account=130000870343 LIMIT 10

SELECT * FROM USER WHERE

account=13056870 LIMIT 10

怀疑在user 表上是否建立索引:

CREATE TABLE `user` (

`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

`account` char(11) NOT NULL COMMENT ‘???’,

…………………….

…………………….

PRIMARY KEY (`id`),

UNIQUE KEY `username` (`account`),

…………………….

) ENGINE=InnoDB CHARSET=utf8 ;

查看执行计划,居然查询使用了全表扫描: db@3027 16:55:06>explain

select * from user where account=13056870343;

+—-+————-+——–+——+—————+——+———+——+——+————-+

| id | select_type | table | type | possible_keys | key | key_len | ref |

rows | Extra |

+—-+————-+——–+——+—————+——+———+——+——+————-+

| 1 | SIMPLE | t_user | ALL | username | NULL | NULL | NULL | 799 |

Using where |

+—-+————-+——–+——+—————+——+———+——+——+————-+

1 row in set (0.00 sec)

为什么这里会是全表扫描?account 上不是已经建立索引来吗?仔细一看,

account 定义为了字符串,而传入的条件为数字,我们知道数字的精度是比字符串高的,所以这里做了隐士转换:to_number(account)=13056870343

(to_number 为将字符串转换为数字),这样即使account 上有索引,也没法使用了,因此我们将传入的数字改为字符串:

db@3027 16:55:13>EXPLAIN SELECT * FROM USER WHERE

account='13056870343';

+----+-------------+--------+-------+---------------+----------+------

| id | select_type | TABLE | TYPE | possible_keys | KEY |

key_len | REF | ROWS | Extra |

+----+-------------+--------+-------+---------------+----------+------

| 1 | SIMPLE | t_user | const | username | username | 33

| const | 1 | |

+----+-------------+--------+-------+---------------+----------+------

1 ROW IN SET (0.00 sec)

可以看到数据已经能够索引到索引username 了。

总结:由于用户在设计表结构的时候字段定义使用了字符串,而传入的条件却传入了数字造成了隐士转换,这是数据库应用中经常出现的典型问题; RDS 足够稳定,但不论在怎么强的数据库,也经不起劣质SQL 的挑战,优化sql 是长期的一项优化措施。

从上面的三个案例,我们可以总结一下,用户在使用RDS 的时候,发现数据库执行sql 超时,性能较差,连接超时等等这些问题,大多数情况下,是由于应用程序的设计,sql 没有优化,或者索引建立的不好而导致;除非实例不可用(主机down 掉,实例服务停掉,实例由于空间太大而被锁定)而导致用户应用不可用(实例的故障RDS 会有监控报警)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_750398.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内好用的五款开源建站系统

推荐5款优秀的开源建站系统,都有免费版本,有需要可以去试试。蝉知 蝉知系统是一款开源的的企业营销自助建站系统。它专为企业营销设计,伪静态网址、关键词、语义化结构,内置流量统计。 蝉知功能全面,文章发布、会员管理…

c2c网站开店的流程图_新手需要了解的亚马逊开店与全球开店基础知识

我做跨境电商也有六年的时间了,在电商这个行业也有自己的一些经验。经验也许没有其他大卖家丰富,但会将我知道的都进行分享。如果有不懂得亚马逊问题可以我(V:772024802)。我这里给大家安排一堂直播课,可以系统的帮你解决做亚马逊…

siteserver模板html5,用SiteServer CMS 创建第一个网站

如果你看到下图所示界面:表示现在你应该已经完成了SiteServer CMS系统的安装,那接下来该怎么办呢?答案就是创建你的第一个SiteServer CMS网站了。本文就讲讲如何使用站点模板快速创建一个SiteServer CMS网站。一、如何正确获取站点模板?正确…

网页快慢与服务器空间,网站空间的要点

原标题:网站空间的要点站空间的时候,应该选择功能多、服务好、运行稳定的空间。这样的空间不仅会增加用户体验,还会增加搜索引擎的友好度,但好的空间费用就会很高,所以要选择性价比高的空间。那么,选择网站…

redis 登录_实战开发,使用 Spring Session 完成网站登录改造

上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险。今天我们就使用这种方式对 Session 存储方式进行改造,将其统一存…

html5实战开发视频,HTMl5网站开发项目实战视频教程

本课程是继HTML5新手入门之后的实战进阶教程,依然是由著名讲师李炎恢老师精心讲解的,本教程用各种实例来为大家讲解HTML5在PC端的固定布局,在移动端的流体布局,以及响应式布局的布局方法,通过多种HTML5布局方法的学习&…

php伪静态网站,php怎么实现网页伪静态

php实现网页伪静态的方法:首先在服务器根目录创建一个“.htaccess”文件;然后添加内容为“RewriteRule ^index-(\d)\.html$ index.php?id$1”即可。本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑.htaccess实现php网站伪静态&…

jitter 如何优化网络_海盈宝典 网络推广如何做好网站SEO优化

网站整站优化是网络推广中做好 SEO的一项重要工作,如何做好 SEO优化?如何做好网站 SEO优化网络推广。一、定位网站关键词搜索引擎优化给网站一开始做优化时,不会马上设置关键词,而是首先分析网站主要是做什么产品/服务。了解网站的…

R语言元胞自动机单车道代码_工具篇|神器一出,作图无忧:一个完爆R语言的作图网站...

同学A:哎,数据分析了好久终于有点眉目了,可是这R语言作图实在是令我头秃呀,一串串的代码,搞得我头昏眼花的,心塞塞~同学B:哈哈哈,不瞒你说,我刚刚发现了一个万能的作图网…

php网站制作成品,PHPweb成品网站修改方法

PHPweb成品网站修改方法(2013-01-04 20:52:04)标签:杂谈分类:网页PHPweb虽然说是智能的,但是由于聚合的比较杂乱,修改起来不是很方便。现在总结一下PHPweb成品网站修改方法:(1)网站右上角联系我们,邮箱等修改路径&…

Linux网站组目录环境命令,Linux初级命令

cd命令cd切换目录:cd 目标目录当前目录:. 上一级目录:.. 返回家目录:cd ~/cd 空格切换到上次所在目录:cd -打印当前用户名字:whomi打印当前用户的用户编号和用户组编号:id打印当前用户家目录&am…

大数据监测网站模板

图示: 演示地址: http://www.bootstrapmb.com/item/4232/preview 这个网站有一大波模板 http://www.bootstrapmb.com/

锚链接点击添加class_用内部链接提升网站收录的技巧分享

大家都知道,增加网站的权重可以增加外部链接,其实优化内部链接还可以帮助提高SEO效果。内部链接主要是在同一个网站上,内容页面相互链接。图片源自网络下面和大家分享如何用内部链接提升网站收录:1.页面链接指向首页在网站多个页面…

如何将网站进行服务器端加密,如何将Zoom Web Client SDK和你的网站整合?

之前我们演示过“如何使用DRM-X4.0保护Zoom Web SDK(防止Zoom会议屏幕录像)”,在这里我们将演示“如何将Zoom Web Client SDK和你的网站进行整合”。修改后的Zoom SDK加入会议的效果如下:用户登录你的网站,通过访问指定的PHP页面,…

网站开发需要哪些技术_网站开发的过程中需要注意哪些问题?

随着互联网的快速发展,网站建设技术方面也不断进步,最初设计制作一个网站需要的时间很长,费用也很高。现在,随着建站系统的出现,节省了网站开发时间,成本。制作一个网站往往只需要设计前端即可,…

mount nfs 密码_IT运维实战篇:NFS+Keepalived高可用集群部署discuz论坛网站

NFS(Network File System)是一个网络文件系统,是Linux系统直接支持文件共享的一直文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访…

5 python 页面说明_PDF 的各种操作,我用 Python 来实现(附网站和操作指导)

导言PDF 处理是日常工作中的常见需求,包括 PDF 合并、删除、提取等。更复杂的任务如:将 PDF 转换成 图像。下面通过几个简单的例子和一份代码,帮助大家解决上面的需求,操作非常简单。在文末我会提供一份源码和一个神奇的 PDF 处理…

php源码仿三一重工,织梦仿三一重工大气企业网站PHP源码

模板介绍源码名称:仿三一重工大气企业网站PHP源码模仿三一重工企业网站PHP源码,测试是完整和无错的,与主流浏览器兼容。模板包含安装说明和测试数据。这个模板是基于DEDE的CMS 5.7GBK设计的。如果需要UTF-8版本,请自己转换。模板的…

我的世界服务器linux网站,Ubuntu架设Minecraft服务器

Minecraft是非常流行的沙盒游戏,为了和几个朋友一起玩这个游戏,我需要一个属于自己的虚拟世界,自己的Minecraft服务器。我在DigitalOcean的vps上架设Minecraft服务器,如果你只需在局域网内游戏,使用本地主机即可。下面…

在阿里云部署 Hexo 网站

一开始自己的网站 leehao.me 托管在 GitHub 上面,考虑到 GitHub 的访问可能不稳定,另外,也是抱着学习的目的,就将网站迁移到阿里云上面来了。 网站的总体结构如下图所示: 域名 leehao.me 指向负载均衡 SLB&#xff08…