私のリアルタイムアプリケーションの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
query fetch patterenは、(did、uniqueid)の述語がどこに追加されても、seprateセカンダリインデックスに追加できますが、メモリconstarintsが問題になる可能性があります。 –
順序付けられたインデックスを追加すると、メモリ空間(DataMemoryから)に1行あたり約10バイトのコストがかかります。 –
ありがとう@mikael - 二次インデックス速度が非常に速く見えます。 –