Mysql
MySQL 集群快速插入但選擇緩慢
我有一個帶有 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();