【发布时间】: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';什么都没做REPAIR或ALTER 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