即使索引

时间:2016-08-24 22:59:54

标签: mysql amazon-web-services indexing

我是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”速度很慢:

  1. query_cache_size:{DBInstanceClassMemory / 24}

  2. query_cache_type:1

  3. innodb_buffer_pool_size:{DBInstanceClassMemory * 3/4}

  4. 切换innodb_adaptive_hash_index = 1

1 个答案:

答案 0 :(得分:0)

摆脱id和当前的PRIMARY KEY。将唯一索引更改为

PRIMARY KEY(`sessionId`,`sequence`)

在更改之后,相关查询将运行得更快(在任何计算机上),并且可能大多数其他查询运行得更快。

此更改还将消除您可能遇到的问题:id限制大约为20亿,而您已达到3亿。

至于为什么两台服务器的性能不同,它们显然运行不同版本的MySQL。哪个版本?

让我们检查别的东西。每个RAM多少钱? innodb_buffer_pool_size的价值是什么?