MySQL从5.5迁移到5.7极其缓慢

时间:2016-11-08 20:00:22

标签: mysql

正如标题中所提到的,我从5.5迁移到5.7,并且我有一个完全破坏的查询:

SELECT
COUNT(*) as count, 
detections.vendor 
FROM (
    SELECT id FROM telemetry_user_agents 
    WHERE date < DATE_SUB(NOW(), INTERVAL 0 DAY) 
    AND date > DATE_SUB(NOW(), INTERVAL 7 DAY)  
) agents 
LEFT JOIN telemetry_detections detections on detections.user_id = agents.id
GROUP BY detections.vendor
ORDER BY count DESC
LIMIT 20

在5.5上,查询需要4秒,在5.7上需要400秒(!),具有完全相同的索引和数据。我已经阅读了5.7中的错误,但我非常确定我可以通过一些查询优化和/或更好的索引找到解决方法。

user_agents有200k条记录,检测有900条记录

以下是结构:

CREATE TABLE `telemetry_user_agents` (
  `id` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `program` text NOT NULL,
  `country` text NOT NULL,
  `ip` text NOT NULL,
  `operating_system` text NOT NULL,
  `bits` int(11) NOT NULL,
  `version` text NOT NULL,
  `license` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE `telemetry_user_agents`
  ADD PRIMARY KEY (`id`),
  ADD KEY `date` (`date`) USING BTREE;

ALTER TABLE `telemetry_user_agents`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;


CREATE TABLE `telemetry_detections` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `type` text NOT NULL,
  `vendor` text NOT NULL,
  `name` text NOT NULL,
  `value` text NOT NULL,
  `hash` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE `telemetry_detections`
  ADD PRIMARY KEY (`id`),
  ADD KEY `user_id` (`user_id`);

ALTER TABLE `telemetry_detections`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

解释说明:

5.5

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    95286   Using temporary; Using filesort
1   PRIMARY     detections  ref     user_id     user_id     4   agents.id   19  
2   DERIVED     telemetry_user_agents   ALL     date    NULL    NULL    NULL    202047  Using where

5.7

id  select_type     table   partitions  type    possible_keys   key     key_len     ref     rows    filtered    Extra   
1   SIMPLE  telemetry_user_agents   NULL    ALL     date    NULL    NULL    NULL    200866  46.50   Using where; Using temporary; Using filesort
1   SIMPLE  detections  NULL    ref     user_id     user_id     4   adlice_stats.telemetry_user_agents.id   19  100.00  NULL

有任何帮助吗? :)

编辑:我创建了一堆索引后:

5.7:

id  select_type     table   partitions  type    possible_keys   key     key_len     ref     rows    filtered    Extra   
1   SIMPLE  telemetry_user_agents   NULL    range   date,date_2     date_2  5   NULL    131741  100.00  Using where; Using index; Using temporary; Using f...
1   SIMPLE  detections  NULL    ref     user_id     user_id     4   adlice_stats.telemetry_user_agents.id   19  100.00  NULL

0 个答案:

没有答案