Mysql 即使使用索引,AWS RDS表读取速度也很慢
我对AWS很陌生 我有两台服务器。一个是我的站点服务器(它位于我的公司而不是我的计算机上,我称它为服务器A),另一个是在AWS上。我正在将表从站点服务器迁移到AWS服务器 我的问题是AWS服务器的表读取速度慢。我不确定延迟是来自DB部分还是可以通过AWS设置解决(如果我可以在这里做些什么) 服务器A基于MySQL(不确定版本),AWS基于Aurora 我的问题是:Mysql 即使使用索引,AWS RDS表读取速度也很慢,mysql,amazon-web-services,indexing,Mysql,Amazon Web Services,Indexing,我对AWS很陌生 我有两台服务器。一个是我的站点服务器(它位于我的公司而不是我的计算机上,我称它为服务器A),另一个是在AWS上。我正在将表从站点服务器迁移到AWS服务器 我的问题是AWS服务器的表读取速度慢。我不确定延迟是来自DB部分还是可以通过AWS设置解决(如果我可以在这里做些什么) 服务器A基于MySQL(不确定版本),AWS基于Aurora 我的问题是: SELECT sessionId, sequence, timestamp, source, sourceType, repId,
SELECT sessionId, sequence, timestamp, source, sourceType, repId,
content, contentType FROM chatLines
WHERE sessionId=%s ORDER BY sequence ASC;
我试图找出这是否是索引问题,但服务器A和AWS服务器的索引信息相同,如下所示:
Table, Non_unique, Key_name, Seq_in_index, Column_name, Collation, Cardinality, Index_type
chatLines, 0, PRIMARY, 1, id, A, 2492436 , BTREE
chatLines, 0, IDX_CHATLINES_SESSIONID_SEQUENCE, 1, sessionId, A, 166162, BTREE
chatLines 0 IDX_CHATLINES_SESSIONID_SEQUENCE 2 sequence A 2492436 BTREE
chatLines 1 IDX_CHATLINES_SESSIONID_TIMESTAMP 1 sessionId A 166162 BTREE
chatLines 1 IDX_CHATLINES_SESSIONID_TIMESTAMP 2 timestamp A 2492436 BTREE
chatLines 1 IDX_CHATLINES_SESSIONID_BYTYPE 1 sessionId A 207703 BTREE
chatLines 1 IDX_CHATLINES_SESSIONID_BYTYPE 2 sourceType A 623109 BTREE
这是我用来创建表的表模式。我从MySQL Workbench->import schema中得到了这个
-- Table structure for table `chatLines`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `chatLines` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sessionId` varchar(20) NOT NULL,
`sequence` smallint(6) NOT NULL,
`timestamp` datetime NOT NULL,
`source` varchar(100) NOT NULL,
`sourceType` char(1) NOT NULL,
`repId` varchar(20) DEFAULT NULL,
`content` mediumtext,
`contentType` char(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `IDX_CHATLINES_SESSIONID_SEQUENCE` (`sessionId`,`sequence`),
KEY `IDX_CHATLINES_SESSIONID_TIMESTAMP` (`sessionId`,`timestamp`),
KEY `IDX_CHATLINES_SESSIONID_BYTYPE` (`sessionId`,`sourceType`),
CONSTRAINT `chatLines_ibfk_1` FOREIGN KEY (`sessionId`)
REFERENCES `chatSessions` (`sessionId`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=308232770 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
以下是解释选择结果:
explain select * from chatLines
where sessionId = 'ID1560302010' order by sequence asc
1. Server A
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, chatLines, ref, IDX_CHATLINES_SESSIONID_SEQUENCE,IDX_CHATLINES_SESSIONID_TIMESTAMP,IDX_CHATLINES_SESSIONID_BYTYPE, IDX_CHATLINES_SESSIONID_SEQUENCE, 62, const, 16, Using where
2. AWS
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, chatLines, ref, IDX_CHATLINES_SESSIONID_SEQUENCE,IDX_CHATLINES_SESSIONID_TIMESTAMP,IDX_CHATLINES_SESSIONID_BYTYPE, IDX_CHATLINES_SESSIONID_SEQUENCE, 62, const, 16,**Using index condition;** Using where
这里是AWS参数(我认为它很重要)配置。请注意,AWS的“选择”速度较慢:
去掉
id
和当前的主键
。将唯一索引更改为
PRIMARY KEY(`sessionId`,`sequence`)
更改后,相关查询将运行得更快(在任何机器上),并且可能大多数其他查询也会运行得更快
这一变化还将消除您可能面临的问题:id
的上限约为20亿,而您已经达到了3亿
至于为什么这两台服务器的性能不同,显然它们运行的是不同版本的MySQL。哪个版本
我们也来看看别的。每个有多少内存?innodb\u buffer\u pool\u size的值是多少??模式是什么样的?编辑问题以添加
SHOW CREATE TABLE chatLines
。此处信息不足,无法回答所问问题。(有人问过问题吗?)没有提到EC2实例的大小、聊天行的存储引擎(InnoDB或MyISAM)、您运行的MySQL版本等。我们只是猜测您已经在Linux上安装了MySQL Community Edition。我们不知道您是如何测量/确定“表格读取速度慢”的。我知道你有一个性能问题,但是这个“问题”的表达方式,没有任何方法可以回答。同时发布你的EXPLAIN SELECT…
的结果,谢谢你更新你的问题。解释@spencer7593并进行诊断:storage engine=InnoDB✔. MySQL版本=?EC2实例大小=?表中的行数=?另外,请尝试不使用ORDER BY的查询,并告诉我这是否有助于提高性能?谢谢您的回答。显然,这是AWS设置的问题。我在我的机器上创建了本地数据库,我的本地数据库和其他服务器一样快速。RDS中的aws设置(我认为这可能很重要)如下:innodb_buffer_pool_size:{DBInstanceClassMemory*3/4}query_cache_size:{DBInstanceClassMemory/24}query_cache_type:1请告诉我是否有任何其他重要参数需要注意。3/4听起来不错。查询缓存设置不太可能影响此问题。但是,我建议query\u cache\u size
不要超过50M。不同的RAM数量?不同的磁盘系统(SSD与旋转等)?两台服务器上的表都是InnoDB吗?版本很重要,因为使用索引条件是一项相对较新的功能。