Мое решение: С @ помощью АлексаОптимизация MySQL
я добавил 3 новых столбцов в таблицу, назовите их год (YYYY), месяц (YYYY-MM) и день (YYYY-ММ DD) и добавить 3 индексов в таблицу:
alter table vaadin_table add index (year, status);
alter table vaadin_table add index (month, status);
alter table vaadin_table add index (day, status);
Теперь мои запросы:
select year,status, count(1) from vaadin_table group by year, status;
select month,status, count(1) from vaadin_table group by month, status;
select day,status, count(1) from vaadin_table group by day, status;
я могу получить результат за 2 секунды! Спасибо за вашу помощь, очень благодарен! Похоже Mysql оленья кожа функции поддержки на индексированных столбцов, что делает мой оригинальный пост запросы не работают
Edit: Спасибо за все ответы.
Чтобы сделать мой вопрос более понятным. Мне нужно получить ежедневную/месячную/годовую статистику со стола.
Поэтому я использую ниже группе ежедневно/ежемесячно/ежегодно данные в следующем порядке:
подстроки (entry_date, 1, 11) ---> YYYY-MM-DD
подстрока (entry_date, 1 , 7) ---> YYYY-MM
подстрока (entry_date, 1, 4) ---> YYYY
Все эти 3 колонки делает мои запросы медленно.
Оригинальный вопрос: У меня есть таблица в 2,7 миллиона строк. Он содержит 3 колонки: имя, статус и entry_date (YYYY-MM-DD HH: MM: SS)
CREATE TABLE IF NOT EXISTS test_table
(id integer not null auto_increment primary key,
name char(20) not null, status char(20) not null,
entry_date datetime default 0);
Моя цель, чтобы получить ежедневные номера за статус:
SELECT substring(entry_date, 1, 11), status, count(1)
FROM test_table
GROUP BY
substring(entry_date, 1, 11), status;
Он работает штраф, но занимает около 10 секунд, чтобы вернуть результат.
Чтобы оптимизировать его, добавить индекс к таблице как:
ALTER table test_table ADD INDEX test_index(entry_date, status);
Я прочитал некоторые подобные вопросы на линии, все предполагают, добавив индекс, основанный на группе по заказу. Но это не помогает моему делу. Это потому, что я использую подстроку entry_date?
Пожалуйста, помогите, спасибо
ваша дата вступления является значением времени даты, почему ваших делать подстроку на него это будет замедлять работу какой-либо причина? –
Почему 'substring (entry_date, 1, 11)', но не только 'entry_date'? – Alex
Вы правы; используя любую функцию в индексированном поле в условии или группируя результаты, игнорируя индекс (для этого условия или группировки). К сожалению, это будет включать использование CAST или других функций даты, которые вы могли бы использовать для получения даты поля datetime. – Uueerdo