SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.07.2010 19:25:14

ravist
Участник
Зарегистрирован: 19.07.2010
Сообщений: 3

Оптимизировать запрос или правильно прописать индексы?

Раз уж я совсем начинающий, то запостил в этот раздел smile.

Есть таблица:

Уникальных значений date - ~700 000
Уникальных значений count - 800

В последнее время сильно возросло кол-во значений после даты 1278878400 (после которой ведется выборка)

Запрос, который выбирает данные из 2 столбцов одной таблицы:

SELECT * FROM `phrases` WHERE `date` > '1278878400' ORDER BY `count` DESC LIMIT 0 , 30;

Пробовал разные варианты ускорения этого запроса
- индекс по столбцу date
- индекс по отдельно по столбцу date и отдельно по столбцу count
- индекс по столбцу date и составной индекс CREATE INDEX date_count ON phrases (date, count);
- индекс по столбцу date и составной индекс CREATE INDEX date_count ON phrases (count, date);


Ничто из этого не помогло ускорить выборку. Сейчас запрос занимает ~1.5 сек.

Подскажите что делать оптимизировать запрос или может можно как-то правильно индекс составить?

Отредактированно ravist (19.07.2010 19:28:21)

Неактивен

 

#2 19.07.2010 19:39:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Оптимизировать запрос или правильно прописать индексы?

А какого формата у Вас дата? А почему такого? smile

Теоретически, (date, count) — это тот индекс, который Вам нужен. Покажите вывод
EXPLAIN SELECT …?

Неактивен

 

#3 19.07.2010 19:45:14

ravist
Участник
Зарегистрирован: 19.07.2010
Сообщений: 3

Re: Оптимизировать запрос или правильно прописать индексы?

Поле      ТИП                  Сравнение
date      varchar(16)      utf8_general_ci
Дата в таком формате, потому, что так сделал разработчик скрипта (я не знаю почему).

id     select_type     table             type             possible_keys     key     key_len     ref     rows                        Extra
1     SIMPLE           phrases        range              date                date     50         NULL    134801     Using where; Using filesort

Отредактированно ravist (19.07.2010 19:53:09)

Неактивен

 

#4 19.07.2010 20:21:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Оптимизировать запрос или правильно прописать индексы?

Кошмар sad

Подозреваю, что там хранится unixtime, поэтому можно сделать int not null —
сэкономите кучу ресурсов.

Что касается индекса — действительно, после DATE уже будет RANGE, поэтому
индекс дальше использоваться не сможет sad

Как вариант:
SELECT * FROM phrases JOIN (SELECT id FROM `phrases` WHERE `date` > '1278878400' ORDER BY `count` DESC LIMIT 0 , 30) s USING (id);
Это не честная оптимизация: тут остается сортировка в памяти, но сортируются
только id, поэтому идет быстрее при большом количестве колонок.

Неактивен

 

#5 19.07.2010 20:29:06

ravist
Участник
Зарегистрирован: 19.07.2010
Сообщений: 3

Re: Оптимизировать запрос или правильно прописать индексы?

paulus написал:

Как вариант:
SELECT * FROM phrases JOIN (SELECT id FROM `phrases` WHERE `date` > '1278878400' ORDER BY `count` DESC LIMIT 0 , 30) s USING (id);

Это не помогло по времени выходит почти также 0.9-3.5 сек.

paulus написал:

поэтому можно сделать int not null —
сэкономите кучу ресурсов.

Как это сделать? Это поможет?

Неактивен

 

#6 19.07.2010 23:39:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Оптимизировать запрос или правильно прописать индексы?

Боюсь, что тогда только менять логику приложения sad
Поможет, но тоже не сильно.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson