1

我有一个非常简单的查询,直接相当于

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;

提前致谢。

4

1 回答 1

0

首先,您可能要考虑是否真的需要 MySQL Cluster,它的性能和复杂性是很多人选择不使用它的原因。一对 MySQL Master-Master 复制或 Master-Slave 复制对于很多商店来说已经足够了。其次,如果您必须保持当前架构,您可以在“somecol”列上添加索引,首先尝试 HASH,然后尝试 B-TREE 索引,它们应该会有所帮助,但性能仍然不如您的简单主机实例。

于 2012-08-07T12:44:32.757 回答