Задать вопрос
M03G
@M03G

Сортировка и выборка в MySQL

Добрый день. Возможно, тема вопроса сформулирована не совсем правильно, но ниже я постараюсь разъяснить.
Я делаю выборrу из таблицы SELECT * FROM history WHERE (`dir` = 1 OR `dir` = 3) и получаю около 25 записей. Далее, я работаю с каждой записью, проверяя чем равен dir. Если =3, идёт приращение одной переменной. Если dir=1, то мне необходимо найти в этой же таблице последнюю по времени запись у которой dir=3 и номер позиции равен тому, который у той, что я нашёл с dir=1. (чтобы было чуть понятней, это таблица приходов/выдачи со склада. 1 = выдана позиция. 3 = принята на склад. в данном случая я ищу цену, по которой в последний раз пришла позиция, выдаваемая мной сейчас).
Запрос SELECT id, doc_cost FROM history WHERE `posid` = $counthis[posid] AND `dir`=3 ORDER BY id DESC LIMIT 1 загружает MySQL чуть ли не намертво.
Посему я делаю полную выборку и уже в ней ищу максимальную цену обычным условием.
$costs = mysql_query("SELECT id, doc_cost FROM history WHERE `posid` = $counthis[posid] AND `dir`=3");
while ($cost = mysql_fetch_array($costs)){
   if($testid<$cost[id]){
      $testid = $cost[id];
   }
}

Таким образом я получаю нужное мне значение достаточно быстро (не более 5сек).

Вопрос, почему так? И как лучше? Как оптимизировать?
  • Вопрос задан
  • 4899 просмотров
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 3
Stdit
@Stdit
Скорее всего запускается фулскан, потому что не находит правильного индекса. Что говорят EXPLAIN запросов? И это, я надеюсь, $counthis[posid] эскейпится перед вставкой в строку запроса, а то выглядит опасно.
Ответ написан
M03G
@M03G Автор вопроса
А можно нескромный вопрос? Как вы так смогли опечататься в слове «выборrу» (я проверил даже: «r» — это «к» на клавиатуре, а дальше идет кириллическая «у»)?

всё просто, сначала было выбору. Попытался исправить на выборку, но когда это увидел, стояла английская раскладку. И вместо К получилось R…
Ответ написан
Комментировать
unconnected
@unconnected
Я как-то не вижу жуткого криминала в ваших запросах.
Первое — постройте индексы по полям участвующим в запросах.

Второе, поскольку мускуль не поддерживает нормально вьюхи (или уже поддерживает? — вопрос в зал) создайте дополнительную таблицу типа:
pos_id int primary,
pos_last_recived DateTime,
pos_last_price float

И при получении на склад помимо history пишите значение в неё (insert on duplicate update)

Тогда простым запросом (через LEFT JOIN) сможете одновременно получать последнюю цену и дату прихода позиции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы