【发布时间】:2016-03-05 08:34:58
【问题描述】:
我在 MySQL 中有以下表格:
CREATE TABLE `events` (
`pv_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,
`time_stamp` bigint(20) unsigned NOT NULL,
`event_type` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
`value_type` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`value_count` bigint(20) DEFAULT NULL,
`alarm_status` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`alarm_severity` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`pv_name`,`time_stamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED;
CREATE TEMPORARY TABLE `matching_pv_names` (
`pv_name` varchar(60) NOT NULL,
PRIMARY KEY (`pv_name`)
) ENGINE=Memory DEFAULT CHARSET=latin1;
matching_pv_names 表包含唯一 events.pv_name 值的子集。
以下查询使用“松散索引扫描”优化运行:
SELECT events.pv_name, MAX(events.time_stamp) AS time_stamp
FROM events
WHERE events.time_stamp <= time_stamp_in
GROUP BY events.pv_name;
是否可以通过将events.pv_name 值限制为matching_pv_names 表中的值来改进此查询的时间而不丢失“松散索引扫描”优化?
【问题讨论】:
-
有点奇怪。 “time_stamp_in”字段来自哪里?
-
time_stamp_in 很可能是输入值。
-
time_stamp_in 是传递给运行查询的存储过程的变量。
-
matching_pv_names 表中有多少行?
-
范围从 1 到 100000 左右。
标签: mysql optimization group-by