MySQL:无法从特定分区中选择记录?

萨哈什·沙(Saharsh Shah)

我正在使用MySQL 5.6我创建了一个具有366个分区的表以按日保存数据,这意味着一年中最多有366天,因此我在该表上创建了366个分区。哈希分区由一个整数列管理,该整数列为每个记录存储1到366。

报告_摘要表:

CREATE TABLE `Report_Summary` (
  `PartitionsID` int(4) unsigned NOT NULL,
  `ReportTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `Amount` int(10) NOT NULL,
  UNIQUE KEY `UNIQUE` (`PartitionsID`,`ReportTime`),
  KEY `PartitionsID` (`PartitionsID`),
  KEY `ReportTime` (`ReportTime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED
/*!50100 PARTITION BY HASH (PartitionsID)
PARTITIONS 366 */

我当前的查询:

SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2014-12-30 23:59:59' AND 
      RS.PartitionsID BETWEEN DAYOFYEAR('2014-12-26 00:00:00') AND DAYOFYEAR('2014-12-30 23:59:59')
GROUP BY ReportDate; 

上面的查询是完全工作和使用分区P360P364获取数据。现在的问题是,当我将fromDate传递给'2014-12-26'并将toDate传递给'2015-01-01'时,上述查询将不起作用。因为“ 2015-01-01”的“一年中的一天”为1,所以我的条件失败了。

现在,我尝试在IN运算符中传递值,然后在查询以下查询的数据库中完美运行:

SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2015-01-01 23:59:59' AND 
      RS.PartitionsID IN (360,361,362,363,364,365,1)
GROUP BY ReportDate; 

为了生成上述场景,我创建了一个函数并传递了两个日期,并生成了一个用逗号分隔的ID字符串

SELECT GenerateRange('2014-12-26 00:00:00', '2015-01-01 23:59:59');

将数据刷新为:

'360,361,362,363,364,365,366,1'

而且我尝试在查询中使用该函数,因此更改了查询,如下所示:

SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2015-01-01 23:59:59' AND 
      FIND_IN_SET(RS.PartitionsID, GenerateRange('2014-12-26 00:00:00', '2015-01-01 00:00:00'))
GROUP BY ReportDate; 

然后,我使用EXPLAIN PARTITION SELECT ...检查了以上查询的执行计划我发现他们的状况不起作用。它使用所有分区来获取数据。我只想使用这些日期的特定分区。只能检查这些360,361,362,363,364,365,366,1分区意味着p360p366p1

为什么我的查询不起作用?这不是实现此目标的正确方法,然后我要解决方案如何实现此目标?

我从编码中知道可以实现此目的,但是我必须编写一个查询来实现此目的。

谢谢...

萨哈什·沙(Saharsh Shah)

我得到了解决方案,因为我更改了在表中存储PartitionsId列的逻辑最初,我将DayOfYear(reportTime)存储PartitionsId列中。现在,我通过存储TO_DAYS(reportTime)并将其存储到PartitionsId列中来更改了该逻辑

所以我的表结构如下:

CREATE TABLE `Report_Summary` (
  `PartitionsID` int(10) unsigned NOT NULL,
  `ReportTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `Amount` int(10) NOT NULL,
  UNIQUE KEY `UNIQUE` (`PartitionsID`,`ReportTime`),
  KEY `PartitionsID` (`PartitionsID`),
  KEY `ReportTime` (`ReportTime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED
/*!50100 PARTITION BY HASH (PartitionsID)
PARTITIONS 366 */

INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735928','2014-12-26 11:46:12','100');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735929','2014-12-27 11:46:23','50');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735930','2014-12-28 11:46:37','44');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735931','2014-12-29 11:46:49','15');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735932','2014-12-30 11:46:59','56');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735933','2014-12-31 11:47:22','68');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735934','2015-01-01 11:47:35','76');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735935','2015-01-02 11:47:43','88');
INSERT INTO `Report_Summary` (`PartitionsID`, `ReportTime`, `Amount`) VALUES('735936','2015-01-03 11:47:59','77');

检查SQL FIDDLE DEMO

我的查询是:

EXPLAIN PARTITIONS 
SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2015-01-01 23:59:59' AND 
      RS.PartitionsID BETWEEN TO_DAYS('2014-12-26 00:00:00') AND TO_DAYS('2015-01-01 23:59:59')
GROUP BY ReportDate; 

上面的查询扫描了我需要的特定分区,并且还使用了正确的索引。因此,在更改PartitionsId的逻辑后,我找到了适当的解决方案

感谢您的所有回复,也非常感谢大家的时间...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从MySQL数据库中选择特定记录

来自分类Dev

使用cql在Cassandra中选择特定记录

来自分类Dev

需要在分区中选择最新的5条记录

来自分类Dev

无法在mysql中选择表

来自分类Dev

从表mysql中选择子记录

来自分类Dev

从mysql中选择类似的记录

来自分类Dev

MySQL从相关表中选择记录

来自分类Dev

从mysql中选择类似的记录

来自分类Dev

从数据库mysql中选择记录

来自分类Dev

sql查询从mysql中选择记录

来自分类Dev

如何在mysql中选择多列值等于一组特定值的记录?

来自分类Dev

MySql-从18446744073709551615记录中选择一条记录

来自分类Dev

MySql-从18446744073709551615记录中选择一条记录

来自分类Dev

无法在Windows窗体中选择特定的控件

来自分类Dev

无法在Windows窗体中选择特定的控件

来自分类Dev

从MySQL中选择N个特定表

来自分类Dev

从MySQL中选择N个特定表

来自分类Dev

如何从.tfrecords文件中选择TensorFlow中的特定记录?

来自分类Dev

使用复选框从表中选择特定记录

来自分类Dev

从sybase表中选择特定的暂存记录

来自分类Dev

从 Java Derby 数据库中选择特定记录

来自分类Dev

从列中选择记录

来自分类Dev

从记录列表中选择

来自分类Dev

MySQL从带有UNION的子查询中选择最新记录

来自分类Dev

MySQL:在一行中选择多个记录

来自分类Dev

如何在MySQL查询中选择特殊的日期记录

来自分类Dev

从表MySQL中选择最新的重复记录

来自分类Dev

MySQL外连接:为什么在ON中选择记录会比在WHERE中选择得到不同的结果?

来自分类Dev

MySQL无法选择表中的记录