【发布时间】:2016-01-12 16:29:06
【问题描述】:
编辑:
假设我在 MySQL 中有下表:
CREATE TABLE `events` (
`pv_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,
`time_stamp` bigint(20) UNSIGNED NOT NULL,
`value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
PRIMARY KEY (`pv_name`, `time_stamp`)
) ENGINE=InnoDB;
我可以使用以下查询在此表中找到具有多个不同 value 的每个 pv_name:
SELECT events.pv_name
FROM events
GROUP BY events.pv_name
HAVING COUNT(DISTINCT events.value) > 1;
问题是这个查询效率不高。它计算所有不同的值,而不是在找到多个值后停止。
一个建议如下:
SELECT events.pv_name
FROM events
GROUP BY events.pv_name
HAVING MIN(events.value) < MAX(events.value);
如果索引包含value,这是有效的。但是,value 是文本列,所以不能。
是否有其他方法可以提高搜索效率?也许某种形式的相关子查询?我想继续使用 MySQL,但如果另一个数据库服务器中有一个功能可以帮助我,我可能会考虑迁移到它。
【问题讨论】:
-
插入的频率如何?时效准确度要求是什么?
-
对于插入率,我没有一个好的固定数字。它可以与数据库允许的一样快。不知道你说的及时准确是什么意思?
-
统计数据的准确性是否存在滞后。这种类型的信息排除或使不同的策略成为可能
-
SELECT * FROM Customers GROUP BY pv_name HAVING MIN(time_stamp ) < MAX(time_stamp );你有time_stamp的价值 -
@Drew:如果您的意思是这样的话,假设在查询时表被冻结是没有问题的?也就是说,您可以忽略在执行查询期间可能添加的任何行。
标签: mysql sql group-by query-optimization distinct