Как я могу оптимизировать свой запрос (ранжированный запрос)? - PullRequest
1 голос
/ 19 марта 2011

В течение последних двух дней я задавал вопросы о ранговых запросах в Mysql. Пока у меня есть рабочие запросы для

  1. запросить все строки таблицы и упорядочить их по рангу.
  2. запрашивать ТОЛЬКО одну строку с ее рангом

Вот ссылка на мой вопрос с прошлой ночи

Как получить ранг строки?

Как вы могли заметить, запрос btilly довольно быстрый.

Вот запрос для получения ТОЛЬКО одной строки с ее рангом, который я сделал на основе запроса btilly.

set @points = -1; 
set @num = 0;

select * from (

SELECT id
  , points
  , @num := if(@points = points, @num, @num + 1) as point_rank
  , @points := points as dummy
FROM points
ORDER BY points desc, id asc

) as test where test.id = 3

Приведенный выше запрос использует подзапрос ... так что ... я беспокоюсь о производительности.

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

Таблица очков

id      points
1   50
2   50
3   40
4   30
5   30
6   20

1 Ответ

1 голос
/ 19 марта 2011

Не впадайте в панику по поводу подзапросов.Подзапросы не всегда медленные - только в некоторых ситуациях.Проблема с вашим запросом состоит в том, что он требует полного сканирования .

Вот альтернатива, которая должна быть быстрее:

SELECT COUNT(DISTINCT points) + 1
FROM points
WHERE points > (SELECT points FROM points WHERE id = 3)

Добавить индекс на id (Я предполагаю, что вы, вероятно, хотите, чтобы здесь был первичный ключ) и другой индекс на points, чтобы этот запрос работал эффективно.

...