【发布时间】:2019-12-02 12:44:15
【问题描述】:
我有两张桌子events 和event_params
第一个表用这些列存储事件
events | CREATE TABLE `events` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`project` varchar(24) NOT NULL,
`event` varchar(24) NOT NULL,
`date` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `project` (`project`,`event`)
) ENGINE=InnoDB AUTO_INCREMENT=2915335 DEFAULT CHARSET=latin1
第二个用这些列存储每个事件的参数
event_params | CREATE TABLE `event_params` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(10) unsigned NOT NULL,
`name` varchar(24) NOT NULL,
`value` varchar(524) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `event_id` (`event_id`),
KEY `value` (`value`),
) ENGINE=InnoDB AUTO_INCREMENT=20789391 DEFAULT CHARSET=latin1
现在我想获取在指定参数上具有不同值的事件的计数
我为campaign 参数编写了此查询,但这太慢了(15 秒响应)
SELECT
event_params.value as campaign,
count(*) as count
FROM `events`
left join event_params on event_params.event_id = events.id
and event_params.name = 'campaign'
WHERE events.project = 'foo'
GROUP by event_params.value
这是EXPLAIN的查询结果:
+----+-------------+--------------+------------+------+---------------------+----------+---------+------------------+------+----------+----------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------------+------------+------+---------------------+----------+---------+------------------+------+----------+----------------------------------------------+
| 1 | SIMPLE | events | NULL | ref | project | project | 26 | const | 1 | 100.00 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | event_params | NULL | ref | name,event_id,value | event_id | 4 | events.events.id | 4 | 100.00 | Using where |
+----+-------------+--------------+------------+------+---------------------+----------+---------+------------------+------+----------+----------------------------------------------+
我可以加快这个查询吗?
【问题讨论】:
-
请使用
SHOW CREATE TABLE table结构为查询中涉及的每个表和EXPLAIN query输出更新问题,我们需要它来解决性能问题.. -
你能发个小提琴吗?我看不出一个仅包含 4 行的数据集是如何花费任何时间的!?!
-
@Strawberry 不,我不太了解解释查询,但数据集有 300 万个事件和 1000 万个 event_params
-
欢迎来到 EAV 模式模式的低效率之一。
-
桌子有多大? 'foo' 的百分比是多少? “广告系列”占多少百分比?
标签: mysql performance join group-by entity-attribute-value