Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как оптимизировать запрос к базе данных?

Сообщения:  [1-10] 

 
 автор: Eugene77   (25.06.2007 в 21:56)   письмо автору
 
   для: Trianon   (24.06.2007 в 22:09)
 

Логично
Но впервые из ваших уст слышу, что можно расслабиться и не беспокоиться понапрасну!
Как-то непривычно.
Действительно, напишу максимально просто, а если будут проблемы -переделаю.

   
 
 автор: Trianon   (24.06.2007 в 22:09)   письмо автору
 
   для: Eugene77   (24.06.2007 в 20:16)
 

если индекс сам по себе достаточно велик - запрос WHERE ... IN ($list) может не поместиться в буфер запроса SQL.
Вы же конкретных цифр не приводите.
А "любовь сэра Генри грозит бедой только сэру Генри".
Дуремар тут вообще не при делах.
ST-хостингу Вы устроите не проблему, а тест-драйв.
Или он Вам.

   
 
 автор: Eugene77   (24.06.2007 в 20:16)   письмо автору
 
   для: Trianon   (22.06.2007 в 22:28)
 

То есть закинуть полторы-три сотни килобайт в память и перемалывать их там 1-10 секунд - это не проблема для современного хостинга? (Функция f() не очень быстрая). Смотрите, насоветуете мне здесь, а потом Cheops_у отдуваться за призовой хостинг, который он мне так неосторожно вручил! Я бы не хотел создать ему проблемы. Как-то бы узнать заранее, насколько загружена у него память?!
И стоит-ли возиться с половинчатым решением.

Это я имею в виду, что можно применять то ваш механизм, то с фильтрацией, как у него в зависимости от объёма запроса.

Но в любом случае спасибо!
Вот эти: unset($tab); и mysql_free_result - для меня важные подсказки!

   
 
 автор: Trianon   (22.06.2007 в 22:28)   письмо автору
 
   для: 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'а

   
 
 автор: Eugene77   (22.06.2007 в 19:48)   письмо автору
 
   для: Trianon   (22.06.2007 в 17:37)
 

>Насколько велики значения в data?
Реально два столбца data1 и data2 одинаковой ширины примерно по 200 (двести) байтов (точную ширину пока вычисляю) Извлекать значения надо сразу из обоих, но действия над значениями data1 и data2 абсолютно аналогичные.

>Можно ли весь набор загрузить сразу в память?
Этот вопрос видимо группируется с предыдущим:
>Нужно, чтобы и в результате было частичное повторение? Или требуется извлечь 256 уникальных значений?

Это как раз главные детали моего вопроса. Мне надо чтобы работало быстро и без проблем, в том числе без проблем с памятью. Я могу, конечно, сочинить скрипт, убирающий повторения в массиве, потом опять их востанавливающий, но это как-то грустно. Я предполагал, что можно сделать это удачно сформированным запросом. Может быть двумя-тремя запросами. Может быть поменять структуру данных.
Но в итоге мне надо получить массив того же размера и с элементами расположенными в той же последовательности. Впрочем, это видно из скрипта, приведённого в самом начале. Он только в смысле скорости хромает. Функция f() выдаёт мне уже готовые строки, котрорые я в цикле вставляю в документ.

   
 
 автор: Trianon   (22.06.2007 в 17:37)   письмо автору
 
   для: Eugene77   (21.06.2007 в 21:59)
 

Насколько велики значения в data?
Можно ли весь набор загрузить сразу в память?

   
 
 автор: cheops   (22.06.2007 в 11:17)   письмо автору
 
   для: Eugene77   (21.06.2007 в 21:59)
 

>В каком порядке они будут отсортированы?
А в каком нужно?

>То есть в $a содержатся частично повторяющиеся числа в пределах от 0 до 255.
Нужно, чтобы и в результате было частичное повторение? Или требуется извлечь 256 уникальных значений?

   
 
 автор: Eugene77   (21.06.2007 в 21:59)   письмо автору
 
   для: cheops   (21.06.2007 в 10:57)
 

Уже интересно! Но как мне потом дальше извлекать значения? В каком порядке они будут отсортированы?
Простите, с "data" опечаточка вышла.
Я хотел написать "row".
Ну а массив $a возникает довольно запутанным путём. Условно можно сказать, что он результат классификации на 256 категорий элементов ответа полученого через POST. Детальные характеристики каждой категории хранятся в столбце data. Мне их нужно максимально быстро извлечь и применить в дальнейшей работе программы. То есть в $a содержатся частично повторяющиеся числа в пределах от 0 до 255. Ну, и не всегда этот массив велик, чаще мал, но надо чтобы и при нескольких сотнях всё срабатывало.

   
 
 автор: cheops   (21.06.2007 в 10:57)   письмо автору
 
   для: Eugene77   (20.06.2007 в 19:50)
 

Откуда берётся массив $a и что он из себя представляет? Как минимум можно заменить цикл foreach следующим образом
<?php
$q 
"SELECT data FROM table WHERE row in (".implode(","$a).")";
?>


PS Также не очень понятно какую роль играет столбец data. Если вы утверждаете, что хотите от него избавиться - зачем он вам сейчас?

   
 
 автор: Eugene77   (20.06.2007 в 19:50)   письмо автору
 
 

У меня есть массив $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[] имеют одинаковые значения.

У кого какие есть идеи? Сам я ничего реального пока придумать не могу.
Лучше, если сразу напишете отрывок кода. Так яснее.
На словах я половину рекомендаций на этом форуме не понимаю.

   

Сообщения:  [1-10] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования