首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL集群快速插入但缓慢选择

MySQL集群快速插入但缓慢选择
EN

Database Administration用户
提问于 2013-12-13 07:14:41
回答 2查看 2.2K关注 0票数 3

我有一个MySQL集群,包含3个数据节点和一个SQL节点。目前我有一百万条1kb的记录。插入速度非常快,只需几毫秒。但选择的速度非常慢>20岁。

所有机器都是m1.大型EC2实例(8GBRAM)。

下面是config.ini:

代码语言:javascript
复制
[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=host1

my.cnf

代码语言:javascript
复制
[mysqld]
ndbcluster
ndb-nodeid=53
ndb-connectstring=host1,

插入:

代码语言:javascript
复制
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);

选择:

代码语言:javascript
复制
SELECT * FROM mytab WHERE mykey = 12345;

创建table语句:

代码语言:javascript
复制
 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的经验吗?

EN

回答 2

Database Administration用户

发布于 2013-12-13 13:53:27

似乎为了解决你的问题,你选择了错误的工具。

当您从基于内存的表中执行多个线程的基于键的查找时,MySQL群集是很好的。当您很少读取数据时,基于磁盘的表可能很有用。或者您的工作数据集是表的一小部分,它应该适合于由DiskPageBufferMemory配置变量定义大小的内存缓存。

如果您的查询需要很多范围或全扫描-即使在物理机器上,MySQL群集也是缓慢的。这是因为这样的查询需要在数据节点之间进行大量的数据交换。尝试在数据节点之间切换。对于范围扫描,数据节点可能需要交换数以万计的这样的消息。

另外,MySQL之前曾说过,对于数据节点,您应该使用物理机器,并对数据节点通信具有良好的互连。我怀疑这个建议在今天已经不成立了。

我认为你应该试着清理你的配置。为了测试这些东西中的大多数,几乎没有什么改变,某些设置可能会减慢速度。尝试以下简化的NDBD_DEFAULT部分:

代码语言:javascript
复制
[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M

LockPagesInMainMemory=2
ODirect=1
票数 1
EN

Database Administration用户

发布于 2013-12-13 16:00:48

多谢你们的支持!我想是我的错。我用的代码是错的。使用setBytes(..)而不是setString(..)。潜伏期从20岁下降到4s。4s仍然无法与mongodb这样的NoSQL db相媲美,但我想没有那么多需要改进的地方。

代码语言:javascript
复制
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();
票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/54937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档