如果表中的行数很大(200 万),NDB cluster7.5(MySQL 5.7)在获取数据时会花费更多时间
Posted
技术标签:
【中文标题】如果表中的行数很大(200 万),NDB cluster7.5(MySQL 5.7)在获取数据时会花费更多时间【英文标题】:NDB cluster7.5(MySQL 5.7) is taking more time in fetching data, if number of rows in table is large(2 million) 【发布时间】:2017-10-03 07:18:49 【问题描述】:我正在尝试为我的一个实时应用程序(具有大量读写并发)设置 NDB 集群(mysql 5.7)。
我的设置 -
3 个数据节点 1个管理节点 1个MySQL节点
所有节点都是 amazon EC2 r3.4xlarge 类型。 操作系统——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)
)
引擎=NDBCLUSTER KEY 分区(did);
现在我用 200 万条记录填充我的表,每个记录都包含 1K 条记录。
查询已触发 - SELECT DISTINCT ContactsAgentContacts.companyname AS 'fullname' from ContactsAgentContacts where did='xyz';
性能提升 -
单并发 - 获取 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
【问题讨论】:
【参考方案1】:切换到主键 (did,uniqueid) 表示 主键上的有序索引将用于扫描 对其中一个分区进行全表扫描。
这应该会大大改善情况。
【讨论】:
查询获取模式与 (did,uniqueid) 的组合 where 谓词不匹配,但我仍然可以将 did 添加到单独的二级索引中,尽管在这种情况下内存约束可能是一个问题。 添加有序索引在内存空间中每行大约需要 10 个字节(来自 DataMemory) 感谢@mikael - 二级索引速度看起来相当快。以上是关于如果表中的行数很大(200 万),NDB cluster7.5(MySQL 5.7)在获取数据时会花费更多时间的主要内容,如果未能解决你的问题,请参考以下文章