SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.06.2011 00:54:06

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Собственно вопрос в заголовке: как грамотнее всего в плане быстродействия организовать выборку 3-х случайных строк из таблицы?

Структура таблицы comments:

+-------------+-----------------------+------+-----+---------------------+----------------+
| Field       | Type                  | Null | Key | Default             | Extra          |
+-------------+-----------------------+------+-----+---------------------+----------------+
| id          | int(11)               | NO   | PRI | NULL                | auto_increment |
| text        | varchar(150)          | NO   | MUL |                     |                |



Не уж то
SELECT text FROM comments ORDER BY RAND() LIMIT 0,3


Если только так только можно, то нужны ли какие-то индексы или что для ускорения работы запроса?

Заранее спасибо за помощь.

Отредактированно valetrammstein (19.06.2011 00:55:44)

Неактивен

 

#2 19.06.2011 13:16:20

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Лучше так:

SELECT id FROM comments ORDER BY RAND() LIMIT 0,3

а потом второй запрос для выбора текста - иначе вы будете сортировать большую таблицу текстов. Также см. FAQ 9

Индексы не требуются.

Неактивен

 

#3 19.06.2011 18:40:08

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Пробовал перемешивать, действительно на больших наборах данных перемешка id выполняется практически мгновенно.

Еще такое, стоит ли заморачиваться, если таблица до 1000 записей?

Неактивен

 

#4 19.06.2011 18:59:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Даже для 1000 сортировка текстов может быть долгой. Все зависит от объема данных, хранимого в text-поле.

Неактивен

 

#5 19.06.2011 19:02:14

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

rgbeast написал:

Даже для 1000 сортировка текстов может быть долгой. Все зависит от объема данных, хранимого в text-поле.

varchar(150)

Неактивен

 

#6 19.06.2011 19:10:56

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

У меня пока на php сделано так:

$db->query( "SELECT id, otzyv FROM t_otzyv order by RAND() LIMIT 0,6" );
$count=0;
        while ( $row_otzyv = $db->get_row() ) {
                $otzyv1 = $row_otzyv['otzyv'];
                $count = $count + 1;
                $vse_otzyvy .= $count . ". " . stripslashes( $otzyv1 ) . "<br />";
        }
 


Прекрасно работает, но как я понял, не помешало бы оптимизировать.
Как это переделать под выборку сначала id, а потом otzyv я не знаю.
Не поможете с кодом?

Неактивен

 

#7 19.06.2011 21:24:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Что-то типа такого:

$db->query( "SELECT id FROM t_otzyv order by RAND() LIMIT 0,6" );
$count=0;
$list = NULL;
while ( $row_otzyv = $db->get_row() ) {
                $list[] = $row_otzyv['id'];
                $count++;
}
if($count) {
  $list_str = "(" . implode(",", $list) . ")";
  $db->query( "SELECT id, otzyv FROM t_otzyv WHERE id IN $list_str" );
  $count=0;
        while ( $row_otzyv = $db->get_row() ) {
                $otzyv1 = $row_otzyv['otzyv'];
                $count++;
                $vse_otzyvy .= $count . ". " . stripslashes( $otzyv1 ) . "<br />";
        }
}

Неактивен

 

#8 19.06.2011 21:36:58

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Спасибо большое. Отлично работает ваш код.
Возникает только мой вопрос дилетанта, а не будет ли это дольше выполняться на уровне PHP. Я понимаю, что для mysql этот вариант проще, а вот не получится ли проигрыш, так для php код получился посложнее. Или это настолько незначительная деталь, что нею можно пренебречь?

Неактивен

 

#9 19.06.2011 21:42:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Здесь принцип такой - оптимизируют, когда что-то медленно. То есть если запрос ORDER BY RAND() будет действительно заметно медленным (а он таким бывает), то разбиваете запрос на два - все потери от этого будут незаметны по сравнению с исходным реально медленным запросом.

Неактивен

 

#10 19.06.2011 22:20:42

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Понятно, просто рчень сложно оценить производительность - и так и так очень быстро.

Неактивен

 

#11 19.06.2011 22:28:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Преждевременная оптимизация - корень всех зол. Иначе говоря, если нет проблемы, то не надо ее решать

В вашем случае добавьте в таблицу в 100 раз больше записей и увидите разницу.

Неактивен

 

#12 19.06.2011 23:02:54

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

rgbeast написал:

В вашем случае добавьте в таблицу в 100 раз больше записей и увидите разницу.

Спасибо за наводку - сейчас так и сделаю.

Неактивен

 

#13 19.06.2011 23:24:22

valetrammstein
Участник
Зарегистрирован: 15.01.2011
Сообщений: 19

Re: Самый быстрый способ сделать выборку нескольких случайных строк из таблицы

Сделал 100000 записей в таблице. Все равно оба варианта работают без видимой задержки. Поэтому считаю, что даже первоначальный вариант с простым ORDER BY нормальный.
Но тем не менее, большое спасибо за помощь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson