我正在尝试为我的一个实时应用程序设置NDB集群(MYsql 5.7)(具有大量的读写并发)。
我的设置 -
3个数据节点 1管理节点 1个MySQL节点
所有节点均为亚马逊EC2 r3.4xlarge类型。 OS - centos 7
我创建了一个表并由主键分区,以确保相同的主键数据在单个节点中。
Table Schema -
CREATE TABLE ContactsAgentContacts(
uniqueid integer not null,
did varchar(32) not null,
nId varchar(50),
companyname varchar(50),
primary key (uniqueid,did)
)
ENGINE = NDBCLUSTER PARTITION BY KEY(确实);
现在我用200万条记录填充了我的表格,每张记录都包含1K记录。
查询已解雇 - SELECT DISTINCT ContactsAgentContacts.companyname AS 'fullname' from ContactsAgentContacts where did='xyz';
表现得到 -
单一并发 - 获取1k的1k记录
**with 1 read concurrency - 800 ms
with 25 read concurrency - 1.5 sec
with 50 read concurrency - 3 sec**
因为我正在尝试开发一个实时系统,任何超过300毫秒的值对我来说太多了,而且随着表中行数的增加,这个时间会增加。 请让我知道如何优化我的解决方案。
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
答案 0 :(得分:1)
切换到主键(did,uniqueid)意味着 主键上的有序索引将用于扫描 在其中一个分区上进行全表扫描。
这应该可以改善数量。