Mysql

MySQL 集群快速插入但選擇緩慢

  • December 25, 2019

我有一個帶有 3 個數據節點和一個 SQL 節點的 MySQL 集群。目前我有 100 萬條 1kb 的記錄。插入速度非常快,只需幾毫秒。但是選擇非常慢> 20s。

所有機器都是 m1.large EC2 實例(8GB RAM)。

這是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=host1

我的.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;

創建表語句:

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-cluster 和 EC2 m1.large 實例嗎?

似乎為了解決您的問題,您選擇了錯誤的工具。

當您主要從基於記憶體的表中的多個執行緒進行基於鍵的查找時,MySQL Cluster 非常好。當您很少讀取數據時,基於磁碟的表可能很有用。或者您的工作數據集是表的一小部分,它應該適合記憶體記憶體,其大小由DiskPageBufferMemory配置變數定義。

如果您的查詢需要多次範圍或完整掃描 - MySQL 集群即使在物理機上也很慢。那是因為這樣的查詢需要在數據節點之間進行大量的數據交換。嘗試在您的數據節點之間進行 ping 操作。而對於範圍掃描,數據節點可能需要交換成百上千的此類消息。

MySQL 之前還表示,對於數據節點,您應該使用物理機器並為數據節點流量提供良好的互連。我懷疑這個建議現在不再有效。

我認為你應該嘗試清理你的配置。對於測試大多數這些東西幾乎沒有任何改變,並且某些設置可能會減慢速度。試試這樣的簡化NDBD_DEFAULT部分:

[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M

LockPagesInMainMemory=2
ODirect=1

感謝您的支持!我想這是我的錯。我使用的程式碼是錯誤的。使用 setBytes(..) 而不是 setString(..)。延遲從 20 秒下降到 4 秒。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