2016-06-29 3 views
1

Мое решение: С @ помощью АлексаОптимизация 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?

Пожалуйста, помогите, спасибо

+0

ваша дата вступления является значением времени даты, почему ваших делать подстроку на него это будет замедлять работу какой-либо причина? –

+0

Почему 'substring (entry_date, 1, 11)', но не только 'entry_date'? – Alex

+0

Вы правы; используя любую функцию в индексированном поле в условии или группируя результаты, игнорируя индекс (для этого условия или группировки). К сожалению, это будет включать использование CAST или других функций даты, которые вы могли бы использовать для получения даты поля datetime. – Uueerdo

ответ

2
SELECT entry_date, status, count(1) 
FROM test_table 
GROUP BY 
DATE(entry_date), status; 

или даже лучше добавить дополнительный столбец с DATE типа

ALTER TABLE test_table ADD COLUMN entry_date1 DATE; 
UPDATE test_table SET entry_date1=DATE(entry_date); 

SELECT entry_date1, status, count(1) 
FROM test_table 
GROUP BY 
entry_date1, status; 
+0

Спасибо за ваш ответ. Я уточнил свой вопрос, чтобы уточнить его. – haifzhan

+0

ваше обновление ничего не меняет. любая функция, вызываемая против каждой записи, нарушает производительность и не будет использовать какой-либо индекс – Alex

+0

любые предложения о том, как я могу решить такие сценарии? высоко оценил – haifzhan

1

Чтобы оптимизировать его, мои предложения, как показано ниже

изменить запрос

SELECT date(entry_date), status, count(1) 
FROM test_table 
GROUP BY 
status,date(entry_date); 

затем создать индекс в следующем порядке колонка

ALTER table test_table ADD INDEX test_index(status,entry_date); 
+0

, тогда он будет использовать индекс статуса, когда он будет выполнять команду по команде –

+0

. Спасибо за ваш ответ, он работает – haifzhan