集群 MySQL 环境中运行缓慢的查询
Posted
技术标签:
【中文标题】集群 MySQL 环境中运行缓慢的查询【英文标题】:Slow-running query on clustered MySQL environment 【发布时间】:2012-07-18 18:09:12 【问题描述】:我有一个很简单的查询,直接相当于
SELECT * FROM sometable t WHERE somecol = 'somevalue' ORDER BY createdon DESC LIMIT 0,20000;
当我在我的非集群开发机器上运行此查询时,它会在 0.07 秒内运行以返回 14k 行结果集。当我在我们的一个集群负载平衡服务器上运行相同的查询时,需要半小时以上才能完成(如果它完全完成的话)。两种环境下的数据完全相同。
对集群框上的查询运行 EXPLAIN 会返回 6 的“行”值,而如果我在我的开发机器上运行它会返回 11177 的行值!
谁能解释为什么会发生这种情况?我怀疑这是由于集群或网络延迟/同步问题造成的,但我不知道如何确定故障排除/诊断。
以下是有关设置的更多信息:
表中的总行数约为 19k,因此它甚至没有达到LIMIT
的限制
mysql 版本是 MySQL 服务器:5.1.56-ndb-7.1.15a-cluster-gpl
Ubuntu 11.04 (GNU/Linux 2.6.38-8-server x86_64)。
存储引擎在集群上是 NDBCLUSTER,在我的开发机器上是 InnoDB
表架构如下,其中 X 是我本地机器上的 InnoDB 或生产服务器上的 NDBCluster。
CREATE TABLE `sometable` (
`Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`UserId` bigint(20) unsigned NOT NULL,
`Cookie` varchar(255) DEFAULT NULL,
`somecol` varchar(30) DEFAULT NULL,
`IpAddress` varchar(255) DEFAULT NULL,
`SomeCollection` text,
`someothercolumn` decimal(6,2) NOT NULL,
`someothercolumn2` decimal(6,2) DEFAULT NULL,
`Result` tinyint(4) NOT NULL,
`Version` tinyint(4) NOT NULL,
`Source` varchar(255) DEFAULT NULL,
`CreatedOn` datetime NOT NULL,
PRIMARY KEY (`Id`),
KEY `CreatedOnIndex` (`CreatedOn`),
KEY `SomeColIndex` (`somecol`),
KEY `ResultIndex` (`Result`),
KEY `SomeCol2Index` (`someothercolumn2`)
) ENGINE=X AUTO_INCREMENT=97043 DEFAULT CHARSET=latin1;
提前致谢。
【问题讨论】:
【参考方案1】:首先,你可能要考虑一下你是否真的需要 MySQL Cluster,它的性能和复杂性是很多人选择不使用它的原因。一对 MySQL Master-Master 复制或 Master-Slave 复制对于很多商店来说已经足够了。其次,如果您必须保持当前架构,您可以在“somecol”列上添加索引,首先尝试 HASH,然后尝试 B-TREE 索引,它们应该会有所帮助,但性能仍然不如您的简单主机实例。
【讨论】:
感谢您的回答和解决问题的建议。我没有选择它作为接受的答案,因为它实际上并没有回答这个问题,所以我希望其他人会权衡这个问题('为什么 EXPLAIN 查询使用不同的引擎返回不同的结果')。跨度>以上是关于集群 MySQL 环境中运行缓慢的查询的主要内容,如果未能解决你的问题,请参考以下文章