Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выбор записей из таблицы Mysql случайно

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
mshdn
Отправлено: 03 Февраля, 2010 - 15:51:12
Post Id


Гость


Покинул форум
Сообщений всего: 90
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




Выбор записей из таблицы Mysql случайно

Нужно максимально быстро выбрать из таблицы Mysql случайным образом 10 записей.
Известный вариант
SELECT * FROM таблица WHERE условие ORDER BY RAND() LIMIT 0,10
работает, но на больших таблицах торомозит.

Есть ли вариант одним запросом( без кода PHP) ( или сложным запросом)
добиться большой скорости на емких таблицах?
 
 Top
Viper
Отправлено: 03 Февраля, 2010 - 15:59:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




mshdn для начала если записей много нужно указывать вместо * названия полей. и... таблица с индексами?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
PeleWin
Отправлено: 13 Февраля, 2010 - 17:02:34
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Запрос с условием "ORDER BY RAND()" тормозит потому, что при каждом сравнении записей значение RAND() вычиляется заново.

Чтобы ускорить выполнение запроса, предварительно можно выполнить фильтрацию записей, тоже по случайному условию. Уменьшив количество исходных записей в 10 раз можно надеяться на уменьшение времени выполнения более, чем в 10 раз.

Пример для таблицы с 60 тысячами записей:

SELECT *
FROM table
ORDER BY RAND()
LIMIT 0, 30
Отображает строки 0 - 29 (57,850 всего, запрос занял 2.7433 сек.)

SELECT *
FROM table
WHERE RAND () < 0.1
ORDER BY RAND()
LIMIT 0 , 30
Отображает строки 0 - 29 (5,872 всего, запрос занял 0.0992 сек.)

(Отредактировано автором: 13 Февраля, 2010 - 17:03:28)

 
 Top
valenok
Отправлено: 14 Февраля, 2010 - 10:39:02
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




два вычислений рэнда можно сократить в одно

SELECT RAND() as 'R'
WHERE 'R' <0.1
ORDER BY 'R'


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB