mysql group by 加入列太慢

标签 mysql performance join group-by entity-attribute-value

我有两个表 eventsevent_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                                  |
+----+-------------+--------------+------------+------+---------------------+----------+---------+------------------+------+----------+----------------------------------------------+

我可以加快这个查询吗?

最佳答案

您可以尝试在 event_params 表上添加以下索引,这可能会加快连接速度:

CREATE INDEX idx1 ON event_params (event_id, name, value);

聚合步骤可能无法优化太多,因为 COUNT 操作涉及对每条记录进行计数。

关于mysql group by 加入列太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181617/

相关文章:

php - 使用 php 和 mysql 从多个表中复制行

mysql - Spring Hibernate JPA 遍历所有数据库模式和所有表

javascript - 有什么方法可以使这个功能在标准浏览器中更有效吗?

c++ - 为什么处理多个数据流比处理一个数据流慢?

c++ - fgets()函数的效率与>>运算符的使用

mysql - 基于选择值的 SQL 列

bash - 连接目录中的所有文件

MySql 从单个 sql 命令获得不同的输出

mysql - Rails 更改 MySQL 和 Postgres 的列类型迁移

sql - LINQ 中的 JOIN 和 LEFT JOIN 等效项