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 :: Работа с более чем 200.000 записями [2]

 PHP.SU

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


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

> Без описания
vlados
Отправлено: 21 Декабря, 2012 - 12:36:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 391
Дата рег-ции: Май 2011  


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

[+][+][+]


Ваш вариант работает 2-3 сек.
Первичный ключ есть, это ID.
 
 Top
eai
Отправлено: 21 Декабря, 2012 - 12:37:42
Post Id



Частый посетитель


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


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




vlados пишет:
Ваш вариант работает 2-3 сек.
Первичный ключ есть, это ID.


Значит у вас что то не так с таблицей или сервером.

Попробуйте SELECT COUNT(ID)
 
 Top
KingStar
Отправлено: 21 Декабря, 2012 - 14:15:41
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




если тебе нужно всегда иметь количество записей в таблице, и при этом не будут изменяется условия - то рациональней будет использовать подсчет COUNT(*) при изменении этой таблицы, и сохранять результат в другой таблице, и при необходимости обращаться уже к ней


-----
То что программа работает, не означает что она написана правильно!
 
 Top
vlados
Отправлено: 21 Декабря, 2012 - 14:17:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 391
Дата рег-ции: Май 2011  


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

[+][+][+]


eai, ваш вариант вполне рабочий. Я просто немного не туда смотрел Улыбка Спасибо.

Теперь появился вопрос, мне нужно вытащить 12 случайных записей. Как это сделать максимально быстро?


CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COLUMN FROM TABLE ORDER BY RAND() LIMIT 12

Выполняется 3 секунды.
 
 Top
KingStar
Отправлено: 21 Декабря, 2012 - 14:21:11
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




vlados пишет:
eai, ваш вариант вполне рабочий.


разницы между COUNT(ID) и SELECT COUNT(*) нет абсолютно никакой Хм


-----
То что программа работает, не означает что она написана правильно!
 
 Top
vlados
Отправлено: 21 Декабря, 2012 - 14:24:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 391
Дата рег-ции: Май 2011  


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

[+][+][+]


CODE (SQL):
скопировать код в буфер обмена
  1. разницы между COUNT(ID) и SELECT COUNT(*) нет абсолютно никакой  
  2.  

Да я просто не на те цифры смотрел Улыбка
(Добавление)
Теперь появился вопрос, мне нужно вытащить 12 случайных записей. Как это сделать максимально быстро?


SELECT COLUMN FROM TABLE ORDER BY RAND() LIMIT 12

Выполняется 3 секунды.
 
 Top
KingStar
Отправлено: 21 Декабря, 2012 - 14:38:36
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




vlados пишет:
Теперь появился вопрос, мне нужно вытащить 12 случайных записей. Как это сделать максимально быстро?


CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table` WHERE `id` IN(1, 5, 6, 9, ... , 4)


короче делаешь рандом чисел, и подставляешь в запрос


-----
То что программа работает, не означает что она написана правильно!
 
 Top
LIME
Отправлено: 21 Декабря, 2012 - 14:43:11
Post Id


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


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


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




необходимо учесть что id может не существовать
 
 Top
KingStar
Отправлено: 21 Декабря, 2012 - 14:44:05
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




LIME пишет:
необходимо учесть что id может не существовать
ну да, согласен


-----
То что программа работает, не означает что она написана правильно!
 
 Top
LIME
Отправлено: 21 Декабря, 2012 - 14:51:05
Post Id


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


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


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




обсуждалось много раз
например
http://www.php.su/forum/topic.ph...8&topic=4335
 
 Top
vlados
Отправлено: 21 Декабря, 2012 - 22:24:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 391
Дата рег-ции: Май 2011  


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

[+][+][+]


Извините, но я что то не нашел того о чем вы пишите.
Вопрос остается открытым. Как вытащить 12 случайных записей из очень большой таблицы?
 
 Top
KingStar
Отправлено: 21 Декабря, 2012 - 23:13:49
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




конечно сам понимаю что неправильно, но может тогда в цикле по одному с проверкой, типа

PHP:
скопировать код в буфер обмена
  1. $count = 200000;
  2. $row = array();
  3. $x = 1;
  4. while(true)
  5. {
  6.    $result = mysql_fetch_array(mysql_query(SELECT * FROM `table` WHERE `id` = ".rand(1, $count)." LIMIT 1"));
  7.  
  8.   if($result)
  9.   {
  10.      $x++;
  11.      $row[] = $result;
  12.   }
  13.  
  14.   if($x == 12) break;
  15.  
  16. }
  17.  
  18. var_dump($row);


как-то так, работу не проверял, писал прямо в форме

(Отредактировано автором: 21 Декабря, 2012 - 23:16:12)



-----
То что программа работает, не означает что она написана правильно!
 
 Top
Panoptik
Отправлено: 22 Декабря, 2012 - 00:39:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `your_table` WHERE id % 7 = 1 LIMIT 12

где 7, 1 случайно сгенерированные числа и 7 > 1


-----
Just do it
 
 Top
LIME
Отправлено: 22 Декабря, 2012 - 09:20:04
Post Id


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


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


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




Panoptik тут очень сильная тенденция к выборке из начала таблицы при сужении диапазона рандому
при его расширении псевдослучайность растет но растет и вероятность ненахождения id
таким образом этот способ сильно зависит от размера таблицы
если вообще выборку с шагом можно назвать случайной
предлагаю всеже ознакомится со статьей на хабре по ссылке выше
как всегда там важнее коменты
имхо лучше всего спец ключ

(Отредактировано автором: 22 Декабря, 2012 - 09:24:38)

 
 Top
eai
Отправлено: 24 Декабря, 2012 - 07:09:58
Post Id



Частый посетитель


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


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




KingStar пишет:
vlados пишет:
eai, ваш вариант вполне рабочий.


разницы между COUNT(ID) и SELECT COUNT(*) нет абсолютно никакой Хм


Теоретически нет, но на практике она почему то иногда встречается. Давно когда то читал большой труд в теоретическое обоснование данного феномена.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB