lightsplash
Новичок
привет, в моей задаче требования к выборке в принципе, аналогичные - нужно быстро и случайно )
вот здесь на форуме чуть ниже висит аналогичный вопрос, с интересной линкой на stackoverflow.com однако, описываемое решение не отличается, ИМХО, скоростью и лояльностью к ресурсам.
В общем, мне известен только один способ, осуществления максимально быстрой выборки некоторого количества случайных строк из большой таблицы (более 1 млн записей), однако, весьма ресурсоёмкой в других своих аспектах, а именно:
- создаём отдельную таблицу состоящую из первичного ключа (в принципе любого индекса) искомой таблицы и просто порядкового счётчика, увеличивающемся ровно на единицу без разрывов в ряде последовательности (то есть, 1, 2, и т.д.)
- при выборке, просто генерим массив случайных чисел из диаппазона 1 : MAX_ROWS (где MAX_ROWS - кол-во строк в таблице) . для твоего случая, если не хочешь генерить в ПХП, можно делать в хранимке
- выбираем значения ключей искомой таблицы из этой вспомогательной таблицы, используя значения полученного массива, как значения предикатов выборки
- собственно, выбираем записи из искомой таблицы на основе полученных ключей в предыдущем шаге.
Разумеется, работает очень быстро, но самый большой минус заключается в том, что эти порядковые номера для индексной таблицы, необходимо переформировывать каждый раз при удалении/добавлении новой записи в искомую таблицу.
Второй же минус - необходимость хранить эту лишнюю таблицу, что увеличивает расход допустимой дисковой квоты
-~{}~ 03.02.10 15:46:
Собственно, поскольку сабж для меня актуален, и мой вопрос очень схож с твоим, то что бы не делать третий дабл сабжа, запощу свою особенность сюда (проблемы очень схожи)
собственно, мне нужно делать всё то, что описано в сабже, только случайные строки должны быть уникальны для каждого пользователя )
то есть: имеем некоторое кол-во юзверей, для них нужно выбирать случайные, уникальные строки для каждого пользователя таким образом, что бы когда-либо выведенные строки для одного конкретного пользователя, более никогда не выбирались для него же.
естественно, решается это хранением доп. полей в таблице (доп вспомогательной таблицы юзер|ключ_строки), выполняющих ф-ции, сходные с никогда не устаревающей сессией
но накладные расходы на хранение всей этой информации (плюс пересчёт вспомогательных индексов) весьма накладно для моей технической базы в физическом смысле (хостинг
)... собственно, возможно кто-нибудь толкнёт в нужном направлении, в случае, если имел опыт решения сабжа в моей интерпретации
зы: здесь пожертвовать скоростью не могу... если нет ничего менее ресурсоёмкого, и выполняющегося так же быстро, как в описанном мною случае, это решение можно не предлагать
спасибо )
-~{}~ 03.02.10 16:04:
mshdn, в общем, например вот здесь http://www.kreker.org/my/21 приводится краткое сравнение различных вариантов (с бэнчмарками), возможно тебе что-то подойдёт... однако лично меня, в силу специфики моей задачи, устраивает не до конца, так что, мой вопрос ещё в силе )
вот здесь на форуме чуть ниже висит аналогичный вопрос, с интересной линкой на stackoverflow.com однако, описываемое решение не отличается, ИМХО, скоростью и лояльностью к ресурсам.
В общем, мне известен только один способ, осуществления максимально быстрой выборки некоторого количества случайных строк из большой таблицы (более 1 млн записей), однако, весьма ресурсоёмкой в других своих аспектах, а именно:
- создаём отдельную таблицу состоящую из первичного ключа (в принципе любого индекса) искомой таблицы и просто порядкового счётчика, увеличивающемся ровно на единицу без разрывов в ряде последовательности (то есть, 1, 2, и т.д.)
- при выборке, просто генерим массив случайных чисел из диаппазона 1 : MAX_ROWS (где MAX_ROWS - кол-во строк в таблице) . для твоего случая, если не хочешь генерить в ПХП, можно делать в хранимке
- выбираем значения ключей искомой таблицы из этой вспомогательной таблицы, используя значения полученного массива, как значения предикатов выборки
- собственно, выбираем записи из искомой таблицы на основе полученных ключей в предыдущем шаге.
Разумеется, работает очень быстро, но самый большой минус заключается в том, что эти порядковые номера для индексной таблицы, необходимо переформировывать каждый раз при удалении/добавлении новой записи в искомую таблицу.
Второй же минус - необходимость хранить эту лишнюю таблицу, что увеличивает расход допустимой дисковой квоты
-~{}~ 03.02.10 15:46:
Собственно, поскольку сабж для меня актуален, и мой вопрос очень схож с твоим, то что бы не делать третий дабл сабжа, запощу свою особенность сюда (проблемы очень схожи)
собственно, мне нужно делать всё то, что описано в сабже, только случайные строки должны быть уникальны для каждого пользователя )
то есть: имеем некоторое кол-во юзверей, для них нужно выбирать случайные, уникальные строки для каждого пользователя таким образом, что бы когда-либо выведенные строки для одного конкретного пользователя, более никогда не выбирались для него же.
естественно, решается это хранением доп. полей в таблице (доп вспомогательной таблицы юзер|ключ_строки), выполняющих ф-ции, сходные с никогда не устаревающей сессией


зы: здесь пожертвовать скоростью не могу... если нет ничего менее ресурсоёмкого, и выполняющегося так же быстро, как в описанном мною случае, это решение можно не предлагать
спасибо )
-~{}~ 03.02.10 16:04:
mshdn, в общем, например вот здесь http://www.kreker.org/my/21 приводится краткое сравнение различных вариантов (с бэнчмарками), возможно тебе что-то подойдёт... однако лично меня, в силу специфики моей задачи, устраивает не до конца, так что, мой вопрос ещё в силе )