我有一个MySQL集群,包含3个数据节点和一个SQL节点。目前我有一百万条1kb的记录。插入速度非常快,只需几毫秒。但选择的速度非常慢>20岁。
所有机器都是m1.大型EC2实例(8GBRAM)。
下面是config.ini:
[NDB_MGMD]
NodeId=49
HostName=host1
DataDir=/var/lib/mysql-mgmd-data
Portnumber=1186
[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M
StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
MaxNoOfTriggers=14336
FragmentLogFileSize=256M
InitFragmentLogFiles=SPARSE
NoOfFragmentLogFiles=16
RedoBuffer=48M
MaxNoOfConcurrentOperations=100000
MaxNoOfConcurrentTransactions=16384
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
TimeBetweenEpochsTimeout=32000
DiskCheckpointSpeedInRestart=100M
DiskCheckpointSpeed=10M
TimeBetweenLocalCheckpoints=20
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000
MemReportFrequency=30
BackupReportFrequency=10
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
SharedGlobalMemory=384M
DiskPageBufferMemory=1G
BatchSizePerLocalScan=512
[NDBD]
NodeId=1
HostName=host2
DataDir=/mnt/mysql-cluster/1/
[NDBD]
NodeId=2
HostName=host3
DataDir=/mnt/mysql-cluster/2/
[NDBD]
NodeId=3
HostName=host4
DataDir=/mnt/mysql-cluster/3/
[MYSQLD DEFAULT]
[MYSQLD]
NodeId=53
HostName=host1my.cnf
[mysqld]
ndbcluster
ndb-nodeid=53
ndb-connectstring=host1,插入:
INSERT INTO mytab(mykey, a, b, c, d, e, f, g, h, i,j)VALUES (1,1,2,3,4,5,6,7,8,9,0);选择:
SELECT * FROM mytab WHERE mykey = 12345;创建table语句:
mytab | CREATE TABLE `mytab` (
`mykey` varchar(32) NOT NULL,
`a` varchar(100) DEFAULT NULL,
`b` varchar(100) DEFAULT NULL,
`c` varchar(100) DEFAULT NULL,
`d` varchar(100) DEFAULT NULL,
`e` varchar(100) DEFAULT NULL,
`f` varchar(100) DEFAULT NULL,
`g` varchar(100) DEFAULT NULL,
`h` varchar(100) DEFAULT NULL,
`i` varchar(100) DEFAULT NULL,
`j` varchar(100) DEFAULT NULL,
PRIMARY KEY (`mykey`)
) /*!50100 TABLESPACE mytab_space STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 MAX_ROWS=1000000000
/*!50100 PARTITION BY KEY (mykey) */ |有人知道为什么这么慢吗?
有人有使用MySQL集群和EC2 m1的经验吗?
发布于 2013-12-13 13:53:27
似乎为了解决你的问题,你选择了错误的工具。
当您从基于内存的表中执行多个线程的基于键的查找时,MySQL群集是很好的。当您很少读取数据时,基于磁盘的表可能很有用。或者您的工作数据集是表的一小部分,它应该适合于由DiskPageBufferMemory配置变量定义大小的内存缓存。
如果您的查询需要很多范围或全扫描-即使在物理机器上,MySQL群集也是缓慢的。这是因为这样的查询需要在数据节点之间进行大量的数据交换。尝试在数据节点之间切换。对于范围扫描,数据节点可能需要交换数以万计的这样的消息。
另外,MySQL之前曾说过,对于数据节点,您应该使用物理机器,并对数据节点通信具有良好的互连。我怀疑这个建议在今天已经不成立了。
我认为你应该试着清理你的配置。为了测试这些东西中的大多数,几乎没有什么改变,某些设置可能会减慢速度。尝试以下简化的NDBD_DEFAULT部分:
[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M
LockPagesInMainMemory=2
ODirect=1发布于 2013-12-13 16:00:48
多谢你们的支持!我想是我的错。我用的代码是错的。使用setBytes(..)而不是setString(..)。潜伏期从20岁下降到4s。4s仍然无法与mongodb这样的NoSQL db相媲美,但我想没有那么多需要改进的地方。
preparedStatement = connection.prepareStatement("INSERT INTO "+ table+" VALUES (?,?,?,?,?,?,?,?,?,?,?)");
preparedStatement.setString(1, key);
for(int i=0; i<byteArray.length; i++){
preparedStatement.setString(i+2, byteArray[i].toString());
}
preparedStatement.executeUpdate();
preparedStatement.close();https://dba.stackexchange.com/questions/54937
复制相似问题