2016-05-16 2 views
5

Я пытаюсь понять, почему запрос так медленен в моей базе данных MySQL. Я читал различные материалы о производительности MySQL, различные вопросы, но это остается загадкой для меня.Очень медленный запрос в таблице mysql с 35 миллионами строк

  1. Я использую MySQL 5.6.23-журнал - MySQL Community Server (GPL)
  2. У меня есть таблица с примерно 35 миллионов строк.
  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 эс примерно 20-30 секунд, а затем дает результирующий набор:

enter image description here

Есть идеи?

EDIT

, как просили, мое шоу создать таблицу:

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

Pls добавляет вывод объяснения запроса и перечисляет все индексы, которые у вас есть на таблице. Вероятно, у вас нет индекса нескольких столбцов, который ускорит запрос. – 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 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 на миллион строк. Я буду рассчитывать один раз в день и сохранять результат в таблице «Статистика», которую вы можете запросить, когда вам нужно ... очевидно, если вам не нужны живые данные.

Смежные вопросы