2016-05-16 28 views
5

我想弄清楚为什么查询在我的MySQL数据库上太慢了。我已经阅读了关于MySQL性能的各种内容,各种SO问题,但这仍然是一个谜。有超过3500万行的mysql表非常慢的查询

  1. 我使用MySQL 23年6月5日 - 日志 - MySQL社区服务器(GPL)
  2. 我有大约350万行的表。
  3. 此表被插入到约5次/秒
  4. 表看起来是这样的: enter image description here

  5. 我对所有列的索引除了ANSWER_TEXT

查询我正在运行的是:

SELECT answer_id, COUNT(1) 
FROM answers_onsite a 
WHERE a.screen_id=384 
AND a.timestamp BETWEEN 1462670000000 AND 1463374800000 
GROUP BY a.answer_id 

此查询tak ES大约20-30秒,然后给出一个结果集:

enter image description here

任何见解?

编辑

的要求,我的节目创建表:

CREATE TABLE 'answers_onsite' (
    'id' bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    'device_id' bigint(20) unsigned NOT NULL, 
    'survey_id' bigint(20) unsigned NOT NULL, 
    'answer_set_group' varchar(255) NOT NULL, 
    'timestamp' bigint(20) unsigned NOT NULL, 
    'screen_id' bigint(20) unsigned NOT NULL, 
    'answer_id' bigint(20) unsigned NOT NULL DEFAULT '0', 
    'answer_text' text, 
    PRIMARY KEY ('id'), 
    KEY 'device_id' ('device_id'), 
    KEY 'survey_id' ('survey_id'), 
    KEY 'answer_set_group' ('answer_set_group'), 
    KEY 'timestamp' ('timestamp'), 
    KEY 'screen_id' ('screen_id'), 
    KEY 'answer_id' ('answer_id') 
) ENGINE=InnoDB AUTO_INCREMENT=35716605 DEFAULT CHARSET=utf8 
+1

请添加查询的解释输出并列出您在表上的所有索引。您可能没有多列索引来加速查询。 – Shadow

+3

屏幕截图通常是显示此信息的可怕方式。你可以用那个表的“SHOW CREATE TABLE”的文本内容替换它吗? – tadman

+0

更新了我的问题,粘贴了create table语句。另外,索引很好地解释了 – ThaiKov

回答

3
ALTER TABLE answers_onsite ADD key complex_index (screen_id,`timestamp`,answer_id); 
1

你可以使用MySQL Partitioning这样的:

alter table answers_onsite drop primary key; 
alter table answers_onsite add primary key (id, timestamp) partition by HASH(id) partitions 500; 

运行上面可能需要同时取决于你的桌子的大小。

0

看看你的WHERE子句:

WHERE a.screen_id=384 AND a.timestamp BETWEEN 1462670000000 AND 1463374800000 GROUP BY a.answer_id

我将建立一个综合指数(screen_id,answer_id,时间戳)和运行一些测试。 您也可以尝试(screen_id,timestamp,answer_id)以查看它是否更好。

BETWEEN子句虽然是任何范围查询,但已知速度很慢。所以COUNT数以百万计的行。我会每天计数一次,并将结果保存到“统计”表中,您可以在需要时查询......显然,如果您不需要实时数据。