在MySql数据库中对数据进行排序

时间:2016-10-18 13:58:43

标签: mysql date bigdata

我做了几次测量测试。我想在一个月内(一次测试)在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小时)进行,可能需要几个小时

感谢;)

马克

2 个答案:

答案 0 :(得分:0)

在阅读了更多的文字后,你应该选择大桌子的第二个选项。问题是您没有将DATE作为索引的一部分。

也不要将时间存储为字符串使用正确的 DateTime 类型

答案 1 :(得分:0)

有几个问题......

  • 缩小数据会加快查询速度;下面的一些项目解决了这个问题。

  • 你可能有一个自然的&#39; PRIMARY KEY;若然,摆脱AUTO_INCREMENT。 (保存8个字节/行)

  • 如果您可以替换PK,那么新PK中列的顺序将非常重要。对于您提到的一个查询,首先test_numberchannel是重要的; date应该是最后的。 (这避免了二级索引的开销,更重要的是,避免了在二级密钥和PK之间跳转。)

  • 您使用的是哪个版本?较新的版本需要5个字节用于DATETIMETIMESTAMP,因此您使用的是无关紧要。

  • dataNULLable;你真的想要吗?

  • 您可以同时INSERT多行吗?这将有助于提高摄取速度。

  • FLOAT为您提供7位有效数字;这对于大多数科学测量非常有用。 (在DOUBLE上保存4个字节。)

  • test_numchannel是4字节有符号整数。赢得2字节SMALLINT UNSIGNED(范围0..65K)就足够了吗?另请参阅MEDIUMINTTINYINT

  • 如果您打算使用其他SELECTs,也请向他们展示。一组好的索引需要同时查看所有SELECTs