За последние 24 часа нас посетили 18465 программистов и 1606 роботов. Сейчас ищут 1246 программистов ...

order by rand() чем заменить?

Тема в разделе "MySQL", создана пользователем joost, 29 июл 2009.

  1. joost

    joost Guest

    order by rand() чем заменить? запросы с ним дают нагрузку на сервер.
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
  3. joost

    joost Guest

    Elkaz
    я по английски ничего не понимаю
    в двух словах - как там решена проблема?
     
  4. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    если нужно получить 10 случайных записей:

    [sql]SELECT quote FROM quotes WHERE id IN (100 случайных чисел через запятую) LIMIT 10[/sql]
     
  5. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    TheShock, не пойдёт, если id идут неплотно.
     
  6. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Vitas, я процитировал решение, которое было дано в статье.
     
  7. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    там про 2 запроса. Первый SELECT id => получаем массив id (плотный) и его длинну ~3953 рандомим 0, 3952 берем нужный. В обще говориться что это быстрее, хоть и два запроса...

    Гугль нормально переводит сайты, когда лень самому напрягаться!
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    -- оффтоп: блиа, я случайно удалил 4 таблицы в мускле и ессно не было никаких бекапов.
     
  9. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    пойду делать бекабы рабочих баз, а то уволят...
     
  10. joost

    joost Guest

    mysql_fetch_array читает результат запроса по строчке
    подскажите функцию, которая получает результат выполнения запроса сразу в масив
     
  11. joost

    joost Guest

    PHP:
    1. $sql_plus_films=mysql_query("select * from films order by rand() limit  20");
    (3+ сек.)
    получается быстрее чем
    PHP:
    1. $count_ids=mysql_num_rows($sql_ids=mysql_query("select id from films "));
    2. for ($c=0;$c<$count_ids;$c++)
    3. {
    4. $array_ids[] = mysql_fetch_array($sql_ids);
    5. }
    6. $sql_plus_films=mysql_query("select * from films where id in (".join(",",array_rand($array_ids,20)).")");
    (4+ сек.)
     
  12. joost

    joost Guest

    может вариант с двумя запросами кривоват у меня?
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    joost, а ты попробуй таблицу на 400 000 записей хотя-бы, как на БашОрге :)
    Дело в том, что ОрдерБайРенд - перед выполнением запроса во всех строках таблицы вставляет случайное значение
     
  14. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    хотя 3 секунды - это очень-очень много.
     
  15. joost

    joost Guest

    TheShock
    как решить задачу?
     
  16. joost

    joost Guest

    подозреваю, что тормозит
    PHP:
    1. array_rand($array_ids,20)
     
  17. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    еще одна попытка:
    дополнительно иметь поле непрерывных ид.
    при удалении н записей переписывать н максимальных ид на удаленные (обработать удаление максимальных)
    выборка идет пыхом Х случайных значений из плотного набора и where r_id in()
     
  18. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
  19. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    любопытно. но недостаток - тот же, что у предыдущего. если у меня 100 записей, а ид начинаются с 101...
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Так там не count, а max. Если 100 записей и id начинается с 101, то максимальный id будет 201.
    Для выборки id будут задаваться в диапазоне 1-201.
     
  21. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ок, наоборот. у меня в таблице 100 записей с ид от 1 до 101 и один max - 10000
     
  22. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Ну, там в статье идет речь о средней распределённости.
    Даже в этом случае вернуться все 10 записей, просто запросы будут сыпаться до тех пор, пока результатов не наберется нужное количество.
     
  23. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    и почти всегда все записи будут с ид = 91-100
     
  24. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Кстати по доборному методу. Зачем в следующем запросе уменьшать число генерируемых значений? И почему бы скажет генерировать не 10, а 20 или ещё больше значений? Тогда вероятность того, что среди них окажется 10 существующих больше чем вероятность того, что 10 существующих окажется среди 10 выбранных. По моему выбрав лишние записи мы много не потеряем.
     
  25. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Да, действительно. Тогда количество запросов можно уменьшить. Спасибо, поправлю.

    Ну да, у меня же общее решение. Для такой распределенности нужно писать что-то свое.