1

私は非常に単純なクエリを持っています。これは直接同等です

SELECT * FROM sometable t WHERE somecol = 'somevalue' ORDER BY createdon DESC LIMIT 0,20000;

クラスター化されていない開発マシンでこのクエリを実行すると、0.07 秒で実行され、14k 行の結果セットが返されます。クラスター化された負荷分散サーバーの 1 つで同じクエリを実行すると、完了するまでに 30 分以上かかります (まったく完了する場合)。両方の環境のデータはまったく同じです。

クラスター化されたボックスでクエリに対して 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 Cluster を使用しない理由です。多くのショップでは、MySQL マスター - マスター レプリケーションまたはマスター - スレーブ レプリケーションのペアで十分です。第二に、現在のアーキテクチャを維持する必要がある場合は、列「somecol」にインデックスを追加し、最初に HASH を試してから B-TREE インデックスを追加できます。それでもパフォーマンスは単純なホスト インスタンスほど良くはありません。

于 2012-08-07T12:44:32.757 に答える