我做了几次测量测试。我想在一个月内(一次测试)在MySQL数据库中以1分钟的速度保存3000个频道。 我想知道我如何构建我的表来改善两个日期之间的渠道研究。
我应该通过测试还是逐个通道或两个解决方案来创建表?
我也知道MySql中有不同类型的日期。哪一个是我申请的最佳选择?
我们尝试了2个解决方案但是一旦有大量数据,所有请求都开始非常慢:
一个有3列通道的表(Test_number,Date,Data)
一个包含4列的大表(Channel,Test_number,Date,Data),索引为(Channel,test number)
我使用带有MSQL Connector 5.3和MySql WorkBench的Labview来测试我的请求。
CREATE TABLE `mesure_ana_in` (
`mesure_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data` double DEFAULT NULL,
`date` datetime NOT NULL,
`test_number` int(11) NOT NULL,
`channel` int(11) NOT NULL,
PRIMARY KEY (`mesure_id`),
KEY `mai_date_idx` (`test_number`,`channel`,`date`)
) ENGINE=InnoDB AUTO_INCREMENT=61552218 DEFAULT CHARSET=utf8;;
(此表(mesure_ana_in)有两个“test_number”:
11:在15小时内通过1010个通道以1Hz填充
12:在4天内以10Hz通道以0.2Hz填充
我的数据表有57093592行。此请求在1分钟内返回53282行。)
SELECT
`Data`,
`Date`,
`Test_number`
FROM `mesure_ana_in`
WHERE `Date` >= '20160912104313'
AND `Date` <= '20160912154313'
AND `Channel` = 3082
AND `Test_number` = 11
ORDER BY `Date` ASC;
它有一个索引
ADD INDEX `idx` (`Test_number` ASC, `channel` ASC, `date` ASC);
当我想导出测试的所有数据时,我按频道的时间块(4小时)进行,可能需要几个小时
感谢;)
马克
答案 0 :(得分:0)
在阅读了更多的文字后,你应该选择大桌子的第二个选项。问题是您没有将DATE
作为索引的一部分。
也不要将时间存储为字符串使用正确的 DateTime 类型
答案 1 :(得分:0)
有几个问题......
缩小数据会加快查询速度;下面的一些项目解决了这个问题。
你可能有一个自然的&#39; PRIMARY KEY
;若然,摆脱AUTO_INCREMENT
。 (保存8个字节/行)
如果您可以替换PK,那么新PK中列的顺序将非常重要。对于您提到的一个查询,首先test_number
或channel
是重要的; date
应该是最后的。 (这避免了二级索引的开销,更重要的是,避免了在二级密钥和PK之间跳转。)
您使用的是哪个版本?较新的版本需要5个字节用于DATETIME
和TIMESTAMP
,因此您使用的是无关紧要。
data
是NULLable
;你真的想要吗?
您可以同时INSERT
多行吗?这将有助于提高摄取速度。
FLOAT
为您提供7位有效数字;这对于大多数科学测量非常有用。 (在DOUBLE
上保存4个字节。)
test_num
和channel
是4字节有符号整数。赢得2字节SMALLINT UNSIGNED
(范围0..65K)就足够了吗?另请参阅MEDIUMINT
和TINYINT
。
如果您打算使用其他SELECTs
,也请向他们展示。一组好的索引需要同时查看所有SELECTs
。