|
|
|
|
|
для: Trianon
(24.06.2007 в 22:09)
| | Логично
Но впервые из ваших уст слышу, что можно расслабиться и не беспокоиться понапрасну!
Как-то непривычно.
Действительно, напишу максимально просто, а если будут проблемы -переделаю. | |
|
|
|
|
|
|
|
для: Eugene77
(24.06.2007 в 20:16)
| | если индекс сам по себе достаточно велик - запрос WHERE ... IN ($list) может не поместиться в буфер запроса SQL.
Вы же конкретных цифр не приводите.
А "любовь сэра Генри грозит бедой только сэру Генри".
Дуремар тут вообще не при делах.
ST-хостингу Вы устроите не проблему, а тест-драйв.
Или он Вам. | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 22:28)
| | То есть закинуть полторы-три сотни килобайт в память и перемалывать их там 1-10 секунд - это не проблема для современного хостинга? (Функция f() не очень быстрая). Смотрите, насоветуете мне здесь, а потом Cheops_у отдуваться за призовой хостинг, который он мне так неосторожно вручил! Я бы не хотел создать ему проблемы. Как-то бы узнать заранее, насколько загружена у него память?!
И стоит-ли возиться с половинчатым решением.
Это я имею в виду, что можно применять то ваш механизм, то с фильтрацией, как у него в зависимости от объёма запроса.
Но в любом случае спасибо!
Вот эти: unset($tab); и mysql_free_result - для меня важные подсказки! | |
|
|
|
|
|
|
|
для: Eugene77
(22.06.2007 в 19:48)
| | по моему его нужно просто положить в память.
<?
$q = "SELECT row, data FROM table";
$h = mysql_query($q);
for($tab = array(); $row = mysql_fetch_assoc(); )
$tab[$row['row']] = $row['data'];
mysql_free_result($h);
$i=0;
foreach($a as $value) $b[$i++] = f($tab[$value]);
unset($tab);
|
Можно добавить фильтрацию по списку - как у cheops'а | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 17:37)
| | >Насколько велики значения в data?
Реально два столбца data1 и data2 одинаковой ширины примерно по 200 (двести) байтов (точную ширину пока вычисляю) Извлекать значения надо сразу из обоих, но действия над значениями data1 и data2 абсолютно аналогичные.
>Можно ли весь набор загрузить сразу в память?
Этот вопрос видимо группируется с предыдущим:
>Нужно, чтобы и в результате было частичное повторение? Или требуется извлечь 256 уникальных значений?
Это как раз главные детали моего вопроса. Мне надо чтобы работало быстро и без проблем, в том числе без проблем с памятью. Я могу, конечно, сочинить скрипт, убирающий повторения в массиве, потом опять их востанавливающий, но это как-то грустно. Я предполагал, что можно сделать это удачно сформированным запросом. Может быть двумя-тремя запросами. Может быть поменять структуру данных.
Но в итоге мне надо получить массив того же размера и с элементами расположенными в той же последовательности. Впрочем, это видно из скрипта, приведённого в самом начале. Он только в смысле скорости хромает. Функция f() выдаёт мне уже готовые строки, котрорые я в цикле вставляю в документ. | |
|
|
|
|
|
|
|
для: Eugene77
(21.06.2007 в 21:59)
| | Насколько велики значения в data?
Можно ли весь набор загрузить сразу в память? | |
|
|
|
|
|
|
|
для: Eugene77
(21.06.2007 в 21:59)
| | >В каком порядке они будут отсортированы?
А в каком нужно?
>То есть в $a содержатся частично повторяющиеся числа в пределах от 0 до 255.
Нужно, чтобы и в результате было частичное повторение? Или требуется извлечь 256 уникальных значений? | |
|
|
|
|
|
|
|
для: cheops
(21.06.2007 в 10:57)
| | Уже интересно! Но как мне потом дальше извлекать значения? В каком порядке они будут отсортированы?
Простите, с "data" опечаточка вышла.
Я хотел написать "row".
Ну а массив $a возникает довольно запутанным путём. Условно можно сказать, что он результат классификации на 256 категорий элементов ответа полученого через POST. Детальные характеристики каждой категории хранятся в столбце data. Мне их нужно максимально быстро извлечь и применить в дальнейшей работе программы. То есть в $a содержатся частично повторяющиеся числа в пределах от 0 до 255. Ну, и не всегда этот массив велик, чаще мал, но надо чтобы и при нескольких сотнях всё срабатывало. | |
|
|
|
|
|
|
|
для: Eugene77
(20.06.2007 в 19:50)
| | Откуда берётся массив $a и что он из себя представляет? Как минимум можно заменить цикл foreach следующим образом
<?php
$q = "SELECT data FROM table WHERE row in (".implode(",", $a).")";
?>
|
PS Также не очень понятно какую роль играет столбец data. Если вы утверждаете, что хотите от него избавиться - зачем он вам сейчас? | |
|
|
|
|
|
|
| У меня есть массив $a[].
Ещё есть таблица:
CREATE TABLE table (TINYINT row NOT NULL PRIMARY KEY, BLOB data NOT NULL)TYPE=MyISAM
В которой 'row' последовательно принимает значения от 0 до 255.
Мне надо получить массив $b[] по вот такой простой формуле:
$i=0;
foreach($a as $value){
$q = "SELECT data FROM table WHERE row=$value";
$h = mysql_query($q);
$b[$i++] = f(mysql_result($h, 0));
}
Где f() определённая мной функция.
Проблема в том, что массив довольно большой (сотни).
Как мне оптимизировать код?
Для этого хорошо бы:
1) обойтись одним запросом к базе,
2) выбросить столбец 'data' из таблицы так как он не несёт никакой информационной нагрузки,
просто указывает номер строки,
3) Учесть как-то что некоторые элементы массива $a[] имеют одинаковые значения.
У кого какие есть идеи? Сам я ничего реального пока придумать не могу.
Лучше, если сразу напишете отрывок кода. Так яснее.
На словах я половину рекомендаций на этом форуме не понимаю. | |
|
|
|
|