我有一個超過34M行(並不斷增長)的MySQL數據庫表。在一個巨大的表上添加一個有效的索引
CREATE TABLE `sensordata` (
`userID` varchar(45) DEFAULT NULL,
`instrumentID` varchar(10) DEFAULT NULL,
`utcDateTime` datetime DEFAULT NULL,
`dateTime` datetime DEFAULT NULL,
`data` varchar(200) DEFAULT NULL,
`dataState` varchar(45) NOT NULL DEFAULT 'Original',
`gps` varchar(45) DEFAULT NULL,
`location` varchar(45) DEFAULT NULL,
`speed` varchar(20) NOT NULL DEFAULT '0',
`unitID` varchar(5) NOT NULL DEFAULT '1',
`parameterID` varchar(5) NOT NULL DEFAULT '1',
`originalData` varchar(200) DEFAULT NULL,
`comments` varchar(45) DEFAULT NULL,
`channelHashcode` varchar(12) DEFAULT NULL,
`settingHashcode` varchar(12) DEFAULT NULL,
`status` varchar(7) DEFAULT 'Offline',
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=98772 DEFAULT CHARSET=utf8
我每分鐘從多個線程(至少400個線程)訪問此表以將數據插入表中。隨着表格的不斷增長,讀取和寫入數據的速度越來越慢。以前需要25秒左右的一個SELECT查詢,然後我加了一個唯一索引
UNIQUE INDEX idx_userInsDate (userID,instrumentID,utcDateTime)
這減少了讀取時間從25秒幾毫秒,但它增加了,因爲它必須更新索引的插入時間爲每個記錄。 另外如果我從多個線程運行SELECT查詢同時查詢花費太長的時間來返回數據。
這是一個例子查詢
Select dateTime from sensordata WHERE userID = 'someUserID' AND instrumentID = 'someInstrumentID' AND dateTime between 'startDate' AND 'endDate' order by dateTime asc;
有人可以幫助我,以提高表架構或添加有效的指標,以提高性能,請。
預先感謝您
UNIQUE(... datetime) - 紅旗!是否有變化,兩行將有效地具有相同的日期時間到第二個? –
您是否嘗試修復建議的數據? – e4c5
@ e4c5是的我正在處理它......數據太大我必須非常小心...... –