Задавайте вопросы, мы ответим
Вы не зашли.
Раз уж я совсем начинающий, то запостил в этот раздел .
Есть таблица:
Уникальных значений 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)
Неактивен
А какого формата у Вас дата? А почему такого?
Теоретически, (date, count) — это тот индекс, который Вам нужен. Покажите вывод
EXPLAIN SELECT …?
Неактивен
Поле ТИП Сравнение
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)
Неактивен
Кошмар
Подозреваю, что там хранится unixtime, поэтому можно сделать int not null —
сэкономите кучу ресурсов.
Что касается индекса — действительно, после DATE уже будет RANGE, поэтому
индекс дальше использоваться не сможет
Как вариант:
SELECT * FROM phrases JOIN (SELECT id FROM `phrases` WHERE `date` > '1278878400' ORDER BY `count` DESC LIMIT 0 , 30) s USING (id);
Это не честная оптимизация: тут остается сортировка в памяти, но сортируются
только id, поэтому идет быстрее при большом количестве колонок.
Неактивен
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 —
сэкономите кучу ресурсов.
Как это сделать? Это поможет?
Неактивен
Боюсь, что тогда только менять логику приложения
Поможет, но тоже не сильно.
Неактивен