[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уменьшение нагрузки, или другие варианты
Гость_Дмитрий
Здравствуйте. Возникла одна проблема, о которой я думаю уже давно, но мои варианты решения сильно нагружены. Надеюсь что есть что то более разумное.

Есть база данных с большим количество записей. Есть столбец "point". У каждого человека разное значение. Необходимо сортировать всё по POINT и написать человеку на каком он месте (т.е. по point определить на каком месте сейчас он находиться в очереди, точнее позиция в таблице лидеров) .

Мой вариант решения состоит из: "Сортировать" -> "Циклом посчитать на каком месте совпадает его ID и вывести на экран номер на котором остановился цикл".

Все вроде просто, но а если в базе 100к записей, а у человека point равен почти самому низкому? Это означает что придется перебирать всю базу (что делает достаточно сильную нагрузку) только для того что бы вывести какое то там 100- тысячное место..

Какие есть варианты решения данного задания? Если вы прочитали все, я уже вам благодарен smile.gif но все таки нужно решение!



Спустя 4 минуты, 54 секунды (16.04.2011 - 20:22) neadekvat написал(а):
Запрос нужен примерно такой:
SELECT COUNT(`user_id`) + 1 as place FROM tbl WHERE point > (SELECT point FROM tbl WHERE user_id = $user_id)

Соответственно, если point конкретного пользователя известен - заменить подзапрос на это значение.

Спустя 15 часов, 57 минут, 53 секунды (17.04.2011 - 12:20) vagrand написал(а):
neadekvat

Ты ошибаешься если думаешь что подзапрос это есть хорошо. Подзапрос будет выполнен для каждой строки, которая будет отобрана в результате выполнения основного запроса, а в твоем случае для всех 100к записей. Мейби это будет даже еще хуже чем вариант ТС-а.

Спустя 49 минут, 54 секунды (17.04.2011 - 13:09) Dr.Mars написал(а):
Цитата (vagrand @ 17.04.2011 - 13:20)
neadekvat

Ты ошибаешься если думаешь что подзапрос это есть хорошо. Подзапрос будет выполнен для каждой строки, которая будет отобрана в результате выполнения основного запроса, а в твоем случае для всех 100к записей. Мейби это будет даже еще хуже чем вариант ТС-а.

с чего ты решил? насколько знаю у mysql есть свой оптимизатор, который на такие то задачи стопудово натравлен

Спустя 3 часа, 38 минут, 19 секунд (17.04.2011 - 16:48) vagrand написал(а):
Dr.Mars

Я взял это из мануала с сайта mysql.com

Спустя 8 минут, 26 секунд (17.04.2011 - 16:56) Гость_Дмитрий написал(а):
Хорошо, госпобда, так что же делать в этой ситуации?

Спустя 27 минут, 2 секунды (17.04.2011 - 17:23) waldicom написал(а):
В порядке бреда:
выбрать общее количество записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1

ась?

Спустя 5 минут, 23 секунды (17.04.2011 - 17:29) Гость_Дмитрий написал(а):
...
Ха, вы правы, это было логичней всего... Спасибо.

Спустя 2 часа, 28 минут, 17 секунд (17.04.2011 - 19:57) neadekvat написал(а):
Цитата (waldicom @ 17.04.2011 - 18:23)
выбрать общее количесвто записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1

Цитата (Гость_Дмитрий @ 17.04.2011 - 18:29)
Ха, вы правы, это было логичней всего... Спасибо.

Спустя 4 минуты, 13 секунд (17.04.2011 - 20:01) Гость_Дмитрий написал(а):
Цитата (neadekvat @ 17.04.2011 - 16:57)
Цитата (waldicom @ 17.04.2011 - 18:23)
выбрать общее количесвто записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1

Цитата (Гость_Дмитрий @ 17.04.2011 - 18:29)
Ха, вы правы, это было логичней всего... Спасибо.

Извиняюсь, конечно. Я просто не силен в MySql запросах, поэтом и не понял сразу что вы хотели сказать этим smile.gif

Спустя 4 минуты, 46 секунд (17.04.2011 - 20:06) waldicom написал(а):
Цитата (neadekvat @ 17.04.2011 - 17:57)
Вы не поверите..

Аппладирую стоя
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.