集群 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 环境中运行缓慢的查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询运行缓慢

非常简单的 MySQL 索引查询运行非常缓慢

presto集群安装&整合hive|mysql|jdbc

如何在多个机器上搭建celery的集群环境

AIX 上生产环境中缓慢的动态 GSP 重新加载

Gitlab Ci使用docker和mysql服务进行缓慢构建