我是AWS的新手。
我有两台服务器。一个是我的站点服务器(位于我的公司而不是我的计算机,我将其称为服务器A ),另一个位于 AWS 。我正在将表从站点服务器迁移到AWS服务器。
我的问题是AWS服务器的表读取速度很慢。我不确定延迟是来自数据库部分还是可以通过AWS设置解决(如果有什么我可以在这里做)。
服务器A基于MySQL(不确定版本),AWS基于Aurora。
我的疑问是:
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得到的 - >导入架构
-- 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结果:
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的“SELECT”速度很慢:
query_cache_size:{DBInstanceClassMemory / 24}
query_cache_type:1
innodb_buffer_pool_size:{DBInstanceClassMemory * 3/4}
切换innodb_adaptive_hash_index = 1
答案 0 :(得分:0)
摆脱id
和当前的PRIMARY KEY
。将唯一索引更改为
PRIMARY KEY(`sessionId`,`sequence`)
在更改之后,相关查询将运行得更快(在任何计算机上),并且可能大多数其他查询运行得更快。
此更改还将消除您可能遇到的问题:id
限制大约为20亿,而您已达到3亿。
至于为什么两台服务器的性能不同,它们显然运行不同版本的MySQL。哪个版本?
让我们检查别的东西。每个RAM多少钱? innodb_buffer_pool_size
的价值是什么?