Можноли оптимизировать?

Статус
В этой теме нельзя размещать новые ответы.

Leonas

Создатель
Регистрация
22 Сен 2010
Сообщения
23
Реакции
0
Написал скрипт выборки данных с базы MySQL, но время выполнения иногда превышает 60 сек. можноли оптимизировать\ускорить?
имеется база данных: поля
DT, pIN1, pIN2, dP1, dP2, dP3, dP4, dP6, dP7, dP8, dP9, dP10
в БД добовляется новая запись (строка) каждые 6 секунд, запись во все поля.
DT - метка времени в формате ггггммддччммсс (год,месяц,число,часы,минуты,секунды), остальное это данные ( числа формата ххххх,хххххх)
pIN1, pIN2 - в эти поля данные пишутся в течении часа одинаковые, в остальные каждый раз разные.
задача: выбрать с базы 24 строки с неповторяюшимися значениями полей pIN1, pIN2 ну за сутки изменения.
вот код :
PHP:
//коннект
   $link = mysql_connect("192.168.12.12", "user", "pass")
        or die("Could not connect : " . mysql_error());
    mysql_select_db("base") or die("Could not select database");
//выборка за первый час
//нахожу одну строку примерно в 00-30 времени и вывожу данные   $rrr = "20100926003%";
    $query = "SELECT DISTINCT pIN1, pIN2 FROM tabd WHERE DT LIKE '$rrr'";
    $result = mysql_query($query) or die("Query failed : " . mysql_error());
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        foreach ($line as $col_value) {
            print $col_value;
            }
        }
// и так 24 раза, меняется только $rrr = "20100926013%"; час.

скрипт работает но очень медленно, иногда более 60 сек, можно ли какнибуть оптимизировать его, ускорить выборку.
 
1) лучше хранить время в поле типа datetime
2) сделать индекс на поле по которому выбираешь
3) в твоем случаи лучше использовать не LIKE а >
 
1) лучше хранить время в поле типа datetime
запись в базу делает другая программа на дэлфи изменить ни формат записи ни программу нет возможности, я могу только читать базу.

3) в твоем случаи лучше использовать не LIKE а >
извиняюсь непонял, как использовать > мне нужно выбрать одну строку (значение).
 
PHP:
$rrr = "20100926013000";
$query = "SELECT pIN1, pIN2 FROM tabd WHERE DT > '$rrr' LIMIT 1";
Если выбираешь одну строку то дистинкт тебе не нужен, а вот лимит будет очень кстати.
 
Сделай индекс на поле DT.
Для этого не надо ни в прогу на делфи лезть, ни чего-то там править.
Все будет работать как и работало.
Код:
ALTER TABLE `tabd` ADD INDEX ( `DT` ) ;
 
Не на локалхосте, случаем, скрипт? Тогда возможно легче просто время исполнения скрипта увеличить))
 
Не на локалхосте, случаем, скрипт? Тогда возможно легче просто время исполнения скрипта увеличить))
скрипт на локалхосте, приведеные советы ускорили работу но не до желаемого результата. для максимальной оптимизации хотелось бы сделать 1 запрос вместо 24.
 
когда foreach находится внутри while - это называется цикл внутри цикла... тут не оптимизация нужна, а принципиально иной подход

например, создать промежуточный скрипт, который будет запускаться раз в час и записывать данные с неповторяюшимися значениями полей pIN1 и pIN2 в отдельную таблицу, а уже из нее делать выборку
 
Если таблица до миллиона записей так же индекс можно повесить на поля pIN1, pIN2 причем составной. Вместо LIKE конечно лучше жесткое равно например :
DT = LEFT($rrr, 11). Если записи добавляются так часто индексы обязательно обновлять используйте OPTIMIZE TABLE. Если я правильно время в колонку ДТ должно добавлятся текущее время добавления. И возможности исправить программу нет. Тогда заведите поле DATETIME и тригером при добавлении ставьте ему NOW().
CREATE TRIGGER my_trigger AFTER INSERT mytable
FOR EACH ROW BEGIN
или так

UPDATE mytable SET mydatecolumn = NOW() WHERE DT = NEW.DT AND pIN1 = NEW.pIN1 and (НУ И ТАК дальше что бы проапдейтить нужную запись.);

(попробовать вариант. не знаю сработает ли но он мне нравится больше. Только тогда триггер должен быть BEFORE INSERT)
или так
SET NEW.mydatecolumn = NOW();


END;
Поле в формате датетайм значительно ускорит работу этого скрипта.
 
вроде с таким запросом скрипт выдает нужную информацию одним запросом к базе и выполняется доли секурны

PHP:
$query = "SELECT DISTINCT pIN1, pIN2 FROM tabd WHERE DT > '$rrr' LIMIT 24";

спосибо, вопрос закрыт.
(предыдусщий пост непонял, знаний маловато)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху