Выборка по алфавиту.

Dam

Guest
Выборка по алфавиту.

Допустим, нужно выдать список из 5000 наименований по алфавиту. Как это лучше сделать, средствами сортировки массивов PHP, или сразу организовать заполнение базы в алфавитном порядке?
 

Скиталец

Guest
Организовать выборку из базы по алфавиту!
 

HEm

Сетевой бобер
Ты не понимаешь как инфа в базе хранится
Можешь считать, что в базе все лежит в беспорядке, сортировки настраиваются в запросах и работают очень быстро (не забудь индексировать поля)
все что можно поручить базе, поручай базе, любой язык (не только пхп) сделает эту задачу медленнее
 

Апокалипсис

Guest
select * from table order by pole

где pole - это твой список который надо вывести

P.S. Данная выборка выводит данные в алфавитном порядке
 

woland

Guest
Не знаю - как насчёт 5000 записей, но если таблица небольшая, то сортировка массива средствами php будет быстрее.
Тест:

#
# Структура таблицы `test`
#

CREATE TABLE test (
id tinyint(1) NOT NULL auto_increment,
alpha varchar(5) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

#
# Дамп данных таблицы `test`
#

INSERT INTO test (alpha) VALUES ('foo');
INSERT INTO test (alpha) VALUES ('bar');
INSERT INTO test (alpha) VALUES ('buzz');
INSERT INTO test (alpha) VALUES ('this');
INSERT INTO test (alpha) VALUES ('value');
INSERT INTO test (alpha) VALUES ('temp');
INSERT INTO test (alpha) VALUES ('dat');
INSERT INTO test (alpha) VALUES ('more');
INSERT INTO test (alpha) VALUES ('raw');

PHP:
<?
mysql_selectdb("test",mysql_connect("","test",""));
$start_time_ms=(double)time()+microtime();
$query=mysql_query("select alpha from test order by alpha");
while($data=mysql_fetch_row($query)){
echo$data[0]."<br>
";}
$running_time=(double)time()+microtime()-$start_time_ms;
echo"db order running time: $running_time msec<br><br>
";
$start_time_ms=(double)time()+microtime();
$query=mysql_query("select alpha from test");
while($data=mysql_fetch_row($query)){
$array[]=$data[0];}
sort($array);
foreach($array as $value){
echo$value."<br>
";}
$running_time=(double)time()+microtime()-$start_time_ms;
echo"array sort running time: $running_time msec";
?>
Результаты:

bar
buzz
dat
foo
more
raw
temp
this
value
db order running time: 0.010800957679749 msec

bar
buzz
dat
foo
more
raw
temp
this
value
array sort running time: 0.0090950727462769 msec

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

tony2001

TeaM PHPClub
woland:
поздравляю.
ты принят в почетные извращенцы после фразы "если таблица небольшая, то сортировка массива средствами php будет быстрее".
больше не давай, плз, таких советов.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: woland
...но, тем не менее, время выполнения второй части меньше, чем время первой.
дурилка ты картонная. при первом прогоне таблица читается с диска, при втором прогоне она уже в кэше.
 

woland

Guest
На примере таблицы в 5000 записей:
db order running time: 1.3178889751434 msec
array sort running time: 5.9424129724503 msec

И, всё-таки, если в таблице мало записей, то сортировка полученного массива будет быстрее, чем запрос order by ...
 

woland

Guest
Sad Spirit, во-первых, выбирай выражения. Мы здесь не на базаре.
Во-вторых, откуда ты можешь знать - сколько раз я её гонял?
 

tony2001

TeaM PHPClub
woland:
еще раз повторяю.
НЕ НАДО ДАВАТЬ ВРЕДНЫЕ СОВЕТЫ.
лучше промолчи.
 

woland

Guest
tony2001, в чём заключается вредность моего совета?
Стояла задача на скорость. Результаты ты видишь в цифрах. Что не так?

P.S. Сомневаешься в результатах - проведи тесты сам и убедись.
 

Larson

Новичок
woland, прежде чем давать советы по оптимизации сортировки массивов, разберись с функцией [m]microtime[/m]
 

woland

Guest
Larson, не будьте голословны. Лучше укажите на конкретную ошибку вместо таких заявлений.
 

tony2001

TeaM PHPClub
>>db order running time: 1.3178889751434 msec
>>array sort running time: 5.9424129724503 msec
>tony2001, в чём заключается вредность моего совета?
>Стояла задача на скорость. Результаты ты видишь в цифрах. Что не так?
я что-то не понял.
сортировка массив средствами РНР занимает в 5 раз больше времени согласно ТВОИМ цифрам.
причем, первая цифра - это не время на сортировку, а время на запрос, т.е. сортировка реально занимает только малую часть из этого времени.
а вторая - именно на сортировку.
ты что, тормоз?
ты САМ привел очевидные результаты и САМ их опровергаешь?
 

if

Guest
db order running time: 1.3178889751434 msec
array sort running time: 5.9424129724503 msec
это цифры для таблицы с 5000 записями
если записей много, то лучше order by ...

если записей мало, то лучше сортировка массива
это доказывают эти цифры:
db order running time: 0.010800957679749 msec
array sort running time: 0.0090950727462769 msec
 

HEm

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

if

Guest
всё складывается из мелочей
но это не самый хороший пример, действительно
 

Larson

Новичок
Да нет, для воланда это вопрос жизни и смерти. Его тут везде оскорбляют, надо доказать что он прав.
Воланд, не надо выбирать подходящие тебе результаты - твое быстродействие лежит в пределах допустимой погрешности измерений, если сделаешь свой тест раз 20 подряд, то ты это увидешь.
 
Сверху