Тема: MySQL, вибірка випадкових 6-ти рядків RAND() +швидкість
Шукаю варіант рішення моєї задачі.
Повернувся до свого робочого сайту і хочу доробити.
!!!_ У мене є таблиця БД MySQL 5,
- в таблиці новини йдуть підряд,
- є ключовий стовпчик (аутоінкрементний) в таблиці
- є нумерований стовпчик UNIQUE, нехай назва NNN
- новини починаются з номеру NNN >= 99
Що хочу:
зараз 6-ть новин, хочу робити багато новин, і щоб вони при запиту до сторінки відкривались рандомно 6-ть аби яких новин.
1. перший варіант - робити рандом пошук кожної строки в Таблиці БД і так 6-ть раз на кожне відкривання сторінки
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
http://akinas.com/pages/en/blog/mysql_random_row/
2. другий варіант, запит до БД, для отримання деяких даних MAX(NNN) , COUNT(*), і інших... а потім створювати рандом 6-ти чисел у PHP, потім новий один запит типу. Таким чином хоч я один буду керувати змінами новин, але вважаю не достить кмітливим, з боку запитів SQL, тобто в теорії, доки зроблю обчислення 6-ти номерів строк у БД, хтось інший може їх змінити (видалити), тобто хочу розуміти на перспективу і не робити таку каку:
====== 2.1. ====
http://biznesguide.ru/coding/172.html
$offset_result = mysql_query("SELECT MAX(id) AS max, MIN(id) AS min FROM `table`");
$offset_row = mysql_fetch_object( $offset_result );
$max = $offset_row->max;
$min = $offset_row->min;
$n = 5; // кількість записів, для отримання
$i = 0;
$ids = array();
while($i < $n){
$ids[] = mt_rand($min,$max);
}
$result = mysql_query( "SELECT * FROM `table` WHERE id IN(".implode(',',$ids).") LIMIT ".$n);
===== 2.2 ==========
SQL .. MAX(NNN) , COUNT(*)
PHP .. $nnn=array[10000, 60000, 110000, 160000, 210000, 260000, 310000, 360000, 410000, 460000] - після створення значень, але поза SQL
SQL .. SELECT id FROM table1 WHERE nnn IN ($nnn[10000], ..... 60000, 110000, 160000, 210000, 260000, 310000, 360000, 410000, 460000);
.... приклад був у коментах тут - http://habrahabr.ru/post/54176/
3. щось цікаве знайшов
тут - http://www.askdev.ru/question/20399/%D0 … %BE%D0%BA/
http://stackoverflow.com/questions/4329 … -rows-fast
http://www.warpconduit.net/2011/03/23/s … k-results/ - !
Multiple Rows at once - http://jan.kneschke.de/projects/mysql/order-by-rand/
..на Рос.: http://hudson.su/2010/09/16/mysql-optim … r-by-rand/
і тут - http://habrahabr.ru/post/207096/
http://alexvolkov.ru/mysql-rand-how-to- … om-db.html
http://biznesguide.ru/coding/172.html
Як мені бути, яким шляхом йти??? які вимоги для колонок обов'язкові? Індекс*?
1) http://habrahabr.ru/post/54176/ - тут є приклад об'єднання шляхом UNION , за методом SQL та є SQL + PHP
2) якось можна методом WHERE nnn IN тільки SQL з розширенням коду? щоб все влізло тільки в SQL ? та швидко шукало ..