【发布时间】:2019-01-29 15:21:37
【问题描述】:
我有一个查询需要很长时间。 〜7分钟尴尬。我真的很感激一些帮助。缺少索引?重写查询?以上都是?
非常感谢
mysql Ver 14.14 Distrib 5.7.25,适用于 Linux (x86_64)
查询看起来像:
SELECT COUNT(*) AS count_all, name
FROM api_events ae
INNER JOIN products p on p.token=ae.product_token
WHERE (ae.created_at > '2019-01-21 12:16:53.853732')
GROUP BY name
这是两个表定义
api_events 拥有约 31 百万条记录
CREATE TABLE `api_events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`api_name` varchar(200) NOT NULL,
`hostname` varchar(200) NOT NULL,
`controller_action` varchar(2000) NOT NULL,
`duration` decimal(12,5) NOT NULL DEFAULT '0.00000',
`view` decimal(12,5) NOT NULL DEFAULT '0.00000',
`db` decimal(12,5) NOT NULL DEFAULT '0.00000',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
`product_token` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `product_token` (`product_token`)
) ENGINE=InnoDB AUTO_INCREMENT=64851218 DEFAULT CHARSET=latin1;
和 products只有 12 条记录
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(30) NOT NULL,
`name` varchar(100) NOT NULL,
`description` varchar(2000) NOT NULL,
`token` varchar(50) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1;
【问题讨论】:
-
为什么是token varchar(50)和product_token varchar(255)?
-
我建议在 created_at 上为 api_events 表使用范围分区。欲了解更多详情,请查看 - https://dev.mysql.com/doc/refman/8.0/en/partitioning-range.html
标签: mysql sql database indexing query-optimization