2017-10-03 4 views
1

私のリアルタイムアプリケーションの1つにNDBクラスタ(MYSQL 5.7)を設定しようとしています読み取りと書き込みの並行性が高い)。テーブルの行数が多い場合、NDB cluster7.5(MySQL 5.7)がデータを取得するのに時間がかかります

マイセットアップ -

3つのデータノード 1管理ノード 1 MySQLのノード

すべてのノードは、Amazon EC2のr3.4xlarge型です。 OS - centos 7

私は1つのテーブルを作成し、同じ主キーデータが単一ノードになるようにプライマリキーで分割しました。

Table Schema - 
CREATE TABLE ContactsAgentContacts(
     uniqueid integer not null, 
     did varchar(32) not null, 
     nId varchar(50), 
     companyname varchar(50), 
primary key (uniqueid,did) 
) 

KEY(DID)BY ENGINE = NDBCLUSTER PARTITION。

今私は、それぞれが1Kレコードを含んでいたような方法で、200万レコードを私のテーブルに移しました。解雇

クエリ - 取得SELECT DISTINCT ContactsAgentContacts.companyname AS 'fullname' from ContactsAgentContacts where did='xyz';

パフォーマンス -

シングル並行処理で - 私は本当を開発しようとしていたよう 1の1Kのレコードをフェッチは

**with 1 read concurrency - 800 ms 
with 25 read concurrency - 1.5 sec 
with 50 read concurrency - 3 sec** 

をしました時間システムでは300 ms以上の値は私にはあまりにも多く、今回はn表の行の数が増えています。 ソリューションを最適化する方法を教えてください。

My configiration . 
config.ini 

[tcp default] 
SendBufferMemory=2M 
ReceiveBufferMemory=2M 

[ndb_mgmd default] 
# Directory for MGM node log files 
DataDir=/var/lib/mysql-cluster 

[ndb_mgmd] 
#Management Node db1 
HostName=10.2.25.129 
NodeId=1 

[ndbd default] 
NoOfReplicas=1 
DataMemory=2000M 
IndexMemory=300M 
LockPagesInMainMemory=1 
#Directory for Data Node 
DataDir=/var/lib/mysql-cluster 
NoOfFragmentLogFiles=300 
MaxNoOfConcurrentOperations=100000 
SchedulerSpinTimer=400 
SchedulerExecutionTimer=100 
RealTimeScheduler=1 
TimeBetweenGlobalCheckpoints=1000 
TimeBetweenEpochs=200 
RedoBuffer=32M 

[ndbd] 
#Data Node db2 
HostName=10.2.18.81 
NodeId=2 
#LockExecuteThreadToCPU=1 
LockMaintThreadsToCPU=0 

[ndbd] 
#Data Node db3 
HostName=10.2.20.15 
NodeId=3 
#LockExecuteThreadToCPU=1 
LockMaintThreadsToCPU=0 

[ndbd] 
#Data Node db4 
HostName=10.2.24.28 
NodeId=4 
#LockExecuteThreadToCPU=1 
LockMaintThreadsToCPU=0 

[mysqld] 
#SQL Node db5 
HostName=10.2.29.42 
NodeId=5 

答えて

1

主キーに切り替え(uniqueidの、やった)主キーの 注文したインデックスがパーティションの1つにスキャン全表スキャンの代わりに のために使用されることを意味します。

これは大きさによって物事を改善するはずです。

+0

query fetch patterenは、(did、uniqueid)の述語がどこに追加されても、seprateセカンダリインデックスに追加できますが、メモリconstarintsが問題になる可能性があります。 –

+0

順序付けられたインデックスを追加すると、メモリ空間(DataMemoryから)に1行あたり約10バイトのコストがかかります。 –

+0

ありがとう@mikael - 二次インデックス速度が非常に速く見えます。 –

関連する問題