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

Тема в разделе "PHP", создана пользователем Leonas, 7 окт 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Leonas

    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($resultMYSQL_ASSOC)) {
            foreach (
    $line as $col_value) {
                print 
    $col_value;
                }
            }
    // и так 24 раза, меняется только $rrr = "20100926013%"; час.
    скрипт работает но очень медленно, иногда более 60 сек, можно ли какнибуть оптимизировать его, ускорить выборку.
     
  2. studentpm

    studentpm

    Регистр.:
    8 ноя 2006
    Сообщения:
    184
    Симпатии:
    132
    1) лучше хранить время в поле типа datetime
    2) сделать индекс на поле по которому выбираешь
    3) в твоем случаи лучше использовать не LIKE а >
     
    Leonas нравится это.
  3. Leonas

    Leonas Создатель

    Регистр.:
    22 сен 2010
    Сообщения:
    23
    Симпатии:
    0
    запись в базу делает другая программа на дэлфи изменить ни формат записи ни программу нет возможности, я могу только читать базу.

    извиняюсь непонял, как использовать > мне нужно выбрать одну строку (значение).
     
  4. studentpm

    studentpm

    Регистр.:
    8 ноя 2006
    Сообщения:
    184
    Симпатии:
    132
    PHP:
    $rrr "20100926013000";
    $query "SELECT pIN1, pIN2 FROM tabd WHERE DT > '$rrr' LIMIT 1";
    Если выбираешь одну строку то дистинкт тебе не нужен, а вот лимит будет очень кстати.
     
    Leonas нравится это.
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Сделай индекс на поле DT.
    Для этого не надо ни в прогу на делфи лезть, ни чего-то там править.
    Все будет работать как и работало.
    Код:
    ALTER TABLE `tabd` ADD INDEX ( `DT` ) ;
    
     
    Leonas нравится это.
  6. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    616
    Симпатии:
    488
    Не на локалхосте, случаем, скрипт? Тогда возможно легче просто время исполнения скрипта увеличить))
     
  7. Leonas

    Leonas Создатель

    Регистр.:
    22 сен 2010
    Сообщения:
    23
    Симпатии:
    0
    скрипт на локалхосте, приведеные советы ускорили работу но не до желаемого результата. для максимальной оптимизации хотелось бы сделать 1 запрос вместо 24.
     
  8. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    когда foreach находится внутри while - это называется цикл внутри цикла... тут не оптимизация нужна, а принципиально иной подход

    например, создать промежуточный скрипт, который будет запускаться раз в час и записывать данные с неповторяюшимися значениями полей pIN1 и pIN2 в отдельную таблицу, а уже из нее делать выборку
     
  9. Otis22

    Otis22 Создатель

    Регистр.:
    13 фев 2009
    Сообщения:
    30
    Симпатии:
    9
    Если таблица до миллиона записей так же индекс можно повесить на поля 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;
    Поле в формате датетайм значительно ускорит работу этого скрипта.
     
  10. Leonas

    Leonas Создатель

    Регистр.:
    22 сен 2010
    Сообщения:
    23
    Симпатии:
    0
    вроде с таким запросом скрипт выдает нужную информацию одним запросом к базе и выполняется доли секурны

    PHP:
    $query "SELECT DISTINCT pIN1, pIN2 FROM tabd WHERE DT > '$rrr' LIMIT 24";
    спосибо, вопрос закрыт.
    (предыдусщий пост непонял, знаний маловато)
     
Статус темы:
Закрыта.