Очень грузит БД запрос.

Тема в разделе "Базы данных", создана пользователем linpc, 20 авг 2016.

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

    linpc

    Регистр.:
    6 апр 2012
    Сообщения:
    178
    Симпатии:
    52
    Очень сильно грузит БД данный запрос:
    PHP:
    $mass=mysql_fetch_assoc(mysql_query(
    "SELECT Sum(`items`.`massa`) AS `mass` ,`invent`.`pl_id` 
    FROM `items` 
    INNER JOIN `invent` ON `items`.`id` = `invent`.`protype` 
    GROUP BY `invent`.`pl_id` 
    HAVING `pl_id`='"
    .$pl['id']."';"));
    Как можно уменьшить ее?
     
    Последнее редактирование модератором: 20 авг 2016
  2. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.382
    Симпатии:
    582
    Для начала...
    Какая бд. тип. Mysql?
    Какое ПО.
    Какое Железо.
    Кусок таблицы 5-10 строк.
    Какие индексы?
    Только так можно вам помочь...
     
  3. linpc

    linpc

    Регистр.:
    6 апр 2012
    Сообщения:
    178
    Симпатии:
    52
    MYSQL
    Стоит на хостинге. железо и ПО не знаю

    Структуру добавил
     

    Вложения:

    • tfg.rar
      Размер файла:
      1,1 КБ
      Просмотров:
      6
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.582
    Симпатии:
    1.484
    Сдаётся мне запрос имеет излишние сущности, попробуй упростить до:
    PHP:
    SELECT Sum(`items`.`massa`) AS `mass` ,`invent`.`pl_id
    FROM `items
    INNER JOIN `inventON `items`.`id` = `invent`.`protype`
    WHERE `pl_id`='1' #тут свою переменную

    Можно попробовать индекс на pl_id и на protype (через explain смотри работают они или нет)
    PHP:
    ALTER TABLE `inventADD INDEX `pl_id` (`pl_id`) ;
    ALTER TABLE `inventADD INDEX `protype` (`protype`) ;

    А еще у тебя логическая ошибка:
    `items`.`id` - bigint
    `invent`.`protype` - int
    по логике они должны быть одинаковой длинны - либо bigint, либо int
     
  5. linpc

    linpc

    Регистр.:
    6 апр 2012
    Сообщения:
    178
    Симпатии:
    52
    ALTER TABLE `invent` ADD INDEX `pl_id` (`pl_id`) ;# Затронуто 1136 строк. ALTER TABLE `invent` ADD INDEX `protype` (`protype`) ;# Затронуто 1136 строк.
     
  6. olegbukatchuk

    olegbukatchuk Постоялец

    Регистр.:
    26 авг 2013
    Сообщения:
    125
    Симпатии:
    23
    Используйте хранимые процедуры и "пинайте" этот запрос кроном, чтобы при надобности данные брались из кеша, как уже готовые.
     
  7. linpc

    linpc

    Регистр.:
    6 апр 2012
    Сообщения:
    178
    Симпатии:
    52
    Люди постоянно берут что то. И массу надо считать
     
  8. olegbukatchuk

    olegbukatchuk Постоялец

    Регистр.:
    26 авг 2013
    Сообщения:
    125
    Симпатии:
    23
    Тогда гуглите, "Тюнинг MySQL" или "Узкие места MySQL".
     
  9. redfoxius

    redfoxius Создатель

    Регистр.:
    26 янв 2016
    Сообщения:
    35
    Симпатии:
    35
    Попробуйте почитать этот трэд и включить кэширование (описано во втором ответе).
     
  10. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.582
    Симпатии:
    1.484
    А ускорить то получилось?
    И сколько этот запрос выполняется вообще?
    Сколько записей в таблице items?
     
    Последнее редактирование: 21 авг 2016
Статус темы:
Закрыта.