SQL ORDER BY производительность - PullRequest
4 голосов
/ 30 марта 2012

У меня есть таблица с более чем 1 миллионом записей. Проблема в том, что запрос занимает слишком много времени, например, 5 минут. «ORDER BY» - моя проблема, но мне нужно выражение в порядке запросов, чтобы получить самые популярные видео. И из-за выражения я не могу создать индекс для него.

Как я могу решить эту проблему?
Thx.

SELECT DISTINCT 
`v`.`id`,`v`.`url`, `v`.`title`, `v`.`hits`, `v`.`created`, ROUND((r.likes*100)/(r.likes+r.dislikes),0) AS `vote` 
FROM 
`videos` AS `v` 
INNER JOIN 
`votes` AS `r` ON v.id = r.id_video 
ORDER BY 
(v.hits+((r.likes-r.dislikes)*(r.likes-r.dislikes))/2*v.hits)/DATEDIFF(NOW(),v.created) DESC

Ответы [ 4 ]

9 голосов
/ 30 марта 2012

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

Также имейте в виду, что у вас есть 1 миллион сейчас, у вас может быть 10 миллионов в ближайшие несколько месяцев. Таким образом, запрос может работать сейчас, но не через месяц, решение должно быть масштабируемым .

Я бы выполнял задание каждые пару часов, чтобы вычислить и сохранить эту информацию в другой таблице. Это может быть не тот ответ, который вы ищете , но я просто должен был это сказать.

1 голос
/ 30 марта 2012

В прошлом я занимался созданием системы голосования на основе целых чисел.Ничто не превзойдет целых чисел.

Системная таблица голосования имеет 2 столбца:

ProductID

VoteCount (INT)

Счетчик голосов сохраняет все голосаОтправлено.

Like = +1

Unlike = -1

Создать индекс в таблице голосования на основе идентификатора.

0 голосов
/ 30 марта 2012

У вас есть альтернативы, чтобы улучшить это: 1) создать новый столбец с заранее рассчитанным необходимым значением 1) создайте вторую таблицу, содержащую первичный ключ видео и результат расчета.

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

Если вы используете второй вариант, ваш ключ может состоять из finalRating плюс первичный ключ таблицы видео. Таким образом, ваши поиски будут значительно улучшены.

0 голосов
/ 30 марта 2012

Пытались ли вы переместить свою арифметику порядка в ваш выбор, а затем упорядочить по виртуальному столбцу, например:

SELECT (col1+col2) AS a
FROM TABLE
ORDER BY a

Арифметика при сортировке стоит дорого.

...