最初に、Mysql Cluster は WAN 用に設計されていないことに注意してください。通常は、ノード間の伝搬遅延が 20 ミリ秒未満であることが最適です。
Mysql Cluster は、シャーディング (データ ノード間でデータを均等に分散) + レプリケーション (データのすべてのフラグメントを 2 回保存) を行います。
とてもシンプルなテーブルのように、
| test | CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`v1` char(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=ndbcluster AUTO_INCREMENT=1871780 DEFAULT CHARSET=latin1
information_schema を確認すると、このテーブルのパーティションが表示されます
mysql> select partition_name,table_rows from information_schema.PARTITIONS where table_name='test' and table_schema='test1';
+----------------+------------+
| partition_name | table_rows |
+----------------+------------+
| p0 | 518667 |
| p1 | 518900 |
| p2 | 517385 |
| p3 | 519050 |
+----------------+------------+
4 rows in set (0.02 sec)
パーティション p0,p2 はデータ ノード 1 を表し、p1,p3 はノード 2 を表します。データは PRIMARY KEY (または、現在主キーが定義されている場合は人工キー) に基づいて分散されます。
Select は、このパーティショニングに基づいて読み取るノードを選択するため、explain を使用する場合
mysql> explain partitions select id,v1 from test where id=1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: p3
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
Extra: NULL
1 row in set (0.00 sec)
mysql> explain partitions select id,v1 from test where id=2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: p2
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
Extra: NULL
id=92 のレコードは 1 つのデータ ノード (地理的に分散したノードの場合もあります) からのみ読み取られますが、残念ながら id 92 だけではありません。
最善の方法は、顧客 ID 92 の別のテーブルを (別のノードに) 作成し、そのテーブル/ノードから読み取るようにアプリケーションを書き直すことです。アプリに対して透過的なソリューションを実現するには、 Mysql Proxyを使用できます。