【问题标题】:Weird issue with MySQL with unexpected resultsMySQL的奇怪问题导致意外结果
【发布时间】:2017-09-11 15:35:05
【问题描述】:

我有一个用于报告的 MySQL 表,引擎是 innoDB,并且有一些分区: /*!50100 PARTITION BY HASH ( YEAR(date) * 12 + MONTH(date)) 分区 48 */

该表有一个日期字段、一个 dealId 字段、一个placementId 字段(以及一些指标列)。

我有一个交易 ID,日期为 2017-09-10:

select count(*) from report_deal_plac where date = "2017-09-10" and dealId = 11983;
+----------+
| count(*) |
+----------+
|       96 |
+----------+
1 row in set (0.00 sec)

但是当我尝试获取该日期的所有 dealId 时,我找不到这个 dealId :

SELECT DISTINCT(dealId) FROM report_deal_plac WHERE date = "2017-09-10";
+--------+
| dealId |
+--------+
|   1938 |
|   3620 |
|   5892 |
|   6360 |
|   6814 |
|   8928 |
|   9010 |
|   9193 |
|   9282 |
|   9583 |
|   9676 |
|  10129 |
|  10300 |
|  10615 |
|  10858 |
|  11259 |
|  11388 |
|  11563 |
+--------+
18 rows in set (0.00 sec)

我尝试使用 group by,以防我遇到 distinct 问题,但它没有帮助:

SELECT dealId FROM report_deal_plac WHERE date = "2017-09-10" group by dealId;
+--------+
| dealId |
+--------+
|   1938 |
|   3620 |
|   5892 |
|   6360 |
|   6814 |
|   8928 |
|   9010 |
|   9193 |
|   9282 |
|   9583 |
|   9676 |
|  10129 |
|  10300 |
|  10615 |
|  10858 |
|  11259 |
|  11388 |
|  11563 |
+--------+

使用 where 子句也无济于事:

SELECT DISTINCT(dealId) FROM report_deal_plac WHERE date = "2017-09-10" and dealId = 11983;
Empty set (0.00 sec)

我做了一个检查表,它说没关系。我尝试了一个 OPTIMIZE 表(它确实重新创建 + 分析,并且结果正常)。但这无济于事。

问题可能来自哪里?

这是表定义:

CREATE TABLE `report_deal_plac` (
  `date` date NOT NULL,
  `dealId` int(11) NOT NULL,
  `placementId` int(11) NOT NULL,
  `impressions` int(11) NOT NULL,
  `impressionsKept` int(11) NOT NULL,
  `impressionsResold` int(11) NOT NULL,
  `dollarRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
  `revenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
  `netDollarRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
  `netRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
  `impressionsMeasured` int(11) DEFAULT '0',
  `impressionsViewed` int(11) DEFAULT '0',
  `impressionsSoldMeasured` int(11) DEFAULT '0',
  `impressionsSoldViewed` int(11) DEFAULT '0',
  `clicks` int(11) DEFAULT '0',
  PRIMARY KEY (`date`,`dealId`,`placementId`),
  KEY `dealid` (`dealId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH ( YEAR(date) * 12 + MONTH(date))
PARTITIONS 48 */

这是我的查询的 EXPLAIN PARTITIONS

explain partitions select DISTINCT(dealId) FROM report_deal_plac WHERE date = '2017-09-10';
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+
| id | select_type | table            | partitions | type  | possible_keys  | key    | key_len | ref  | rows | Extra                                 |
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+
|  1 | SIMPLE      | report_deal_plac | p21        | range | PRIMARY,dealid | dealid | 4       | NULL |  533 | Using where; Using index for group-by |
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+

更新:对此的结语:

  • 使用BETWEEN '2017-09-10' AND '2017-09-11' 有效(11 日根本没有数据)。我不知道为什么。 (而BETWEEN '2017-09-10' AND '2017-09-10' 没用)

  • 使用聚合函数和 GROUP BY 工作

  • SET optimizer_switch = 'index_merge_intersection=off'; 什么都没做

  • REPAIRALTER TABLE t1 ENGINE = InnoDB; 没有改变任何东西

我得到的所有 dealId 都是我在表格中只有一行日期的那些。

我通过创建另一个具有完全相同名称的表并执行INSERT INTO new_table SELECT * FROM old_table、截断旧表并从新表重新插入来解决此问题。

【问题讨论】:

  • 你的 MySQL 版本是多少?它是 InnoDB 表吗?尝试使用非分区表进行测试?启用查询缓存了吗?
  • 我们也可以使用SHOW CREATE TABLE 吗?
  • 我添加了SHOW CREATE TABLE。是的,这是一个 innoDB 表。我没有尝试过使用非分区表。我认为查询缓存已启用。但是 SELECT SQL_NO_CACHE DISTINCT(dealId) 具有相同的结果。版本为:mysql Ver 14.14 Distrib 5.6.37,适用于 Linux (x86_64)
  • 如果你使用BETWEEN '2017-09-09' AND '2017-09-11'会发生什么? SELECT MAX(date) = '2017-09-10' FROM report_deal_plac WHERE dealId= 11983 and date = '2017-09-10'呢?
  • 我使用了BETWEEN '2017-09-10' AND '2017-09-11',得到了预期的结果(我没有11号的数据)。第二次约会只使用 10 就可以得到我的问题的结果。这是一个很好的指针,谢谢!即使我仍然不明白一个简单的 WHERE 的结果......

标签: mysql


【解决方案1】:

您缺少每个值的COUNTdealId = 11983 可能有多行

SELECT dealId, count(*)
FROM report_deal_plac
WHERE date = "2017-09-10"
group by dealId;

你应该看到你正在寻找的结果

【讨论】:

  • 这确实给了我预期的结果。但为什么 ?我可以看到,如果没有 count(*),我只会得到只有一行的行。但是为什么 group by 会这样呢?有什么我可以读到的吗?
  • 现在我重建了表格,我不需要COUNT 来获得所有结果
  • GROUP BY supposed 隐藏重复的细节 - 所以是不同的。所以计数显示了隐藏的东西的数量。至于为什么重建会显示所有结果... IDK :-/
猜你喜欢
  • 2010-11-14
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2021-04-24
  • 2013-10-11
相关资源
最近更新 更多