Случайная выборка mysql - Форум успешных вебмастеров - GoFuckBiz.com - Страница 2
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB90.1887
BTC/USD67927.0758
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 30.09.2011, 00:17
Start Post: Случайная выборка mysql 
  #11
rushter
Senior Member
 
Регистрация: 28.11.2009
Сообщений: 1,800
Бабло: $299365
По умолчанию

Кто-нибудь знает как можно оптимизировать получение случайных записей в mysql ?
Цитата:
SELECT * FROM `ai` ORDER BY RAND() LIMIT 0,10;
Не реально долго работает при 15 млн записей. В общем нужна случайная выборка не прогружая всё в память, может быть есть какие-то спец субд для этого ?
rushter вне форума  
Старый 30.09.2011, 09:25   #12
t0os
сам иди в жопу!
 
Аватар для t0os
 
Регистрация: 02.05.2009
Сообщений: 672
Бабло: $81580
По умолчанию

http://www.titov.net/2005/09/21/do-n...ws-from-table/
__________________
t0os вне форума  
Старый 30.09.2011, 11:41   #13
rushter
Senior Member
 
Регистрация: 28.11.2009
Сообщений: 1,800
Бабло: $299365
ТС -->
автор темы ТС По умолчанию

Забыл дополнить, данные постоянно добавляются и удаляются.
Соответственно индексы всегда разные и с разрывами, получать их все займёт столько же времени. Кэшировать их тоже не вариант, часто меняются.
А так бы я и сам додумался id генерировать
rushter вне форума  
Старый 30.09.2011, 12:07   #14
Revolver
Особый статус
 
Регистрация: 18.07.2007
Сообщений: 73
Бабло: $2005
По умолчанию

Цитата:
Сообщение от dveredel Посмотреть сообщение
Мда, конечно советовать Сфинкс для решения классической задачи "оптимизация рандомной выборки из огромной таблицы по айди", это либо непонимание задачи, либо сфинкса )
Ну конечно, если вопрос стоит задачу решить, то ее можно решить, не используя spihnx. А если нужна производительность, я другой альтернативы не вижу.
__________________
Покупаю сайты
Revolver вне форума  
Старый 30.09.2011, 12:35   #15
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

Цитата:
Сообщение от rushter Посмотреть сообщение
Забыл дополнить, данные постоянно добавляются и удаляются.
Соответственно индексы всегда разные и с разрывами, получать их все займёт столько же времени. Кэшировать их тоже не вариант, часто меняются.
А так бы я и сам додумался id генерировать
так ты попробуй моими способами, даже несколько запросов с целью угадать рандом индекс - все равно будет быстрее, чем order by rand(). Либо нагенери 100 ранд чисел и запрашивай where id in (тут числа через запятую). У таких запросов сложность O(N), у order by rand() примерно O(log N), а у хеш-индексов O(1) я вообще их использую повсеместно....да и половина технологий хайлоада базируется на этом

а кешировать нужно только мин. и макс. индексы - это один предварительный запрос.

А если нужна скорость, то переходи в память, там все летать будет ну и функционал хеш-индексов получишь
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 30.09.2011, 20:48   #16
TerVer
Senior Member
 
Аватар для TerVer
 
Регистрация: 14.09.2007
Сообщений: 740
Бабло: $73721
По умолчанию

по айди, если с разрывами не очень рандомно будет (не равновероятно).
Остается. Содать поле `rnd` для записей. При инсерте ... `rnd`=RAND()*10000000
при выборке три запроса.
SELECT MIN(`rnd`)
SELECT MAX(`rnd`)
$myrnd=mt_rand($min-1,$max+1); // PHP
SELECT WHERE `rnd`>'$myrnd' LIMIT 1

как вариант

ЗЫ нидекс по `rnd` само собой
TerVer вне форума  
Старый 01.10.2011, 04:16   #17
TerVer
Senior Member
 
Аватар для TerVer
 
Регистрация: 14.09.2007
Сообщений: 740
Бабло: $73721
По умолчанию

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

SELECT... WHERE `rnd`>(RAND()*10000000) LIMIT 1
TerVer вне форума  
Старый 01.10.2011, 06:16   #18
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

TerVer, согласен на счет равновероятности, поэтому я "слежу" за своим индексом.

Твой вариант будет более требовательный к памяти, местами даже очень, т.к. ты выбираешь диапазон (знак >) и если rand() будет 1, то в выборку попадут все 15кк записей - ваще не торт. Но этот способ лучше ORDER BY rand() тем, что не нужно выбранные записи сортировать по виртуальному полю(наверно даже без индекса) - это да, плюс, т.к. сортировка очень много затратная. Но памяти все равно будет выжираться много. Я его пробовал, меня не устроило.
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 02.10.2011, 02:01   #19
TerVer
Senior Member
 
Аватар для TerVer
 
Регистрация: 14.09.2007
Сообщений: 740
Бабло: $73721
По умолчанию

а как такой вариант
SELECT COUNT()
mt_rand(1,$count)
SELECT * FROM `keys8_` ORDER BY `rnd` LIMIT $rnd,1

COUNT будет время съедать? его можно не все время пересчитывать.
TerVer вне форума  
Старый 02.10.2011, 07:59   #20
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

Цитата:
Сообщение от TerVer Посмотреть сообщение
а как такой вариант
SELECT COUNT()
mt_rand(1,$count)
SELECT * FROM `keys8_` ORDER BY `rnd` LIMIT $rnd,1

COUNT будет время съедать? его можно не все время пересчитывать.
да похер на count - у него сложность максимум O(N), но скорее всего O(1), т.к. метаданные о таблице логичнее хранить в системных полях, а не считать каждый раз.

Тут две проблемы:

1) ORDER BY - это тяжелая операция у которой сложность в районе O(n*log n), в зависимости от алго и наличия индексов. Вообще, сортировкой не надо пользоваться, если нужна скорость.
2) LIMIT $rnd,1 - это будет жрать память, т.к. нет WHERE
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 02.10.2011, 10:30   #21
xatman
Особый статус
 
Аватар для xatman
 
Регистрация: 05.10.2007
Сообщений: 771
Бабло: $163646
По умолчанию

Oracle
__________________
EvaPharmacy - лучшая фарма партнерка (ICQ: 750000 Jabber: [email protected]) / Помощь детям.
xatman вне форума  
Закрытая тема