1

Тема: Допоможіть критикою SQL запиту

Для ясності - я не програміст (3 роки юридичної практики), тому сподіваюсь на конструктивну критику.
В процесі створення проекту виникла необхідність виконувати такий запит:

SELECT tour_name, tour_variant_price, 

GROUP_CONCAT( DISTINCT exp_travel_tour_date.tour_date_date ORDER BY tour_date_date ASC ) AS tour_dates

FROM exp_travel_tours
  LEFT JOIN exp_travel_tour_date ON tour_id = tour_date_tour_id
  LEFT JOIN exp_travel_tour_variants ON ( tour_id = tour_variant_tour_id

  AND tour_variant_price = ( 
    SELECT MIN( tour_variant_price ) 
    FROM exp_travel_tour_variants
    WHERE tour_id = tour_variant_tour_id )
  ) 

WHERE tour_date_date > "2013-10-10"

GROUP BY exp_travel_tours.tour_id

ORDER BY tour_variant_price DESC 

LIMIT 10

Тестовий результат вибоки:

array(2) {
  [0]=>
  array(3) {
    ["tour_name"]=>
    string(6) "Тур"
    ["tour_variant_price"]=>
    string(3) "180"
    ["tour_dates"]=>
    string(65) "2013-10-14,2013-10-15,2013-10-16,2013-10-17,2013-10-18,2013-10-19"
  }
  [1]=>
  array(3) {
    ["tour_name"]=>
    string(8) "тур 2"
    ["tour_variant_price"]=>
    NULL
    ["tour_dates"]=>
    string(43) "2013-10-22,2013-10-23,2013-10-24,2013-10-25"
  }
}

В таблиці буде  <= 5000 записів, навантаження на проект  максимально 10 запитів в секунду.

Питання: наскільки поганий цей запит?

Bartash: код слід брати у теги [ code ].

2

Re: Допоможіть критикою SQL запиту

Запит має повне право на існування.

Можна ще додати альяси (псевдоніми) таблицям, з яких тягнете дані: зручніше та наочніше виглядатиме код. :)

3 Востаннє редагувалося ozimok (22.10.2013 16:05:21)

Re: Допоможіть критикою SQL запиту

Альяси - в них не має необхідності оскільки назва кожної колонки в таблиці містить назву таблиці.
Проблема в тому, що кінцевий запит буде:

SELECT 
    tour_id,
    tour_name,
    tour_length, 
    tour_currency_id,

    GROUP_CONCAT(DISTINCT tour_date_date ORDER BY tour_date_date ASC) AS tour_dates,
    
    GROUP_CONCAT(DISTINCT city_name SEPARATOR " / ") AS tour_cities,
    
    GROUP_CONCAT(DISTINCT transport_name) AS tour_transport,
    
    tour_variant_price, 
    tour_variant_price_old,
    
    rate.exchange_rate_value AS exchange_rate,
    
    rate_default.exchange_rate_value AS exchange_rate_default
    
FROM '.$this->db->dbprefix('tours').'

LEFT JOIN '.$this->db->dbprefix('tour_date').' 
    ON tour_id = tour_date_tour_id
    
LEFT JOIN '.$this->db->dbprefix('tour_city').' 
    ON tour_id = tour_city_tour_id
    
LEFT JOIN '.$this->db->dbprefix('cities').' 
    ON tour_city_city_id = city_id
    
LEFT JOIN '.$this->db->dbprefix('tour_transport').' 
    ON tour_id = tour_transport_tour_id
    
LEFT JOIN '.$this->db->dbprefix('transport').' 
    ON tour_transport_transport_id = transport_id
        
LEFT JOIN '.$this->db->dbprefix('exchange_rates').' rate 
    ON tour_partner_id = exchange_rate_partner_id
        AND exchange_rate_cy_id = tour_currency_id

LEFT JOIN '.$this->db->dbprefix('exchange_rates').' rate_default 
    ON rate_default.exchange_rate_partner_id = 0
        AND rate_default.exchange_rate_cy_id = tour_currency_id 

LEFT JOIN '.$this->db->dbprefix('tour_variants').' 
    ON (tour_id = tour_variant_tour_id
        
        AND tour_variant_price = (
            SELECT MIN(tour_variant_price) 
            FROM '.$this->db->dbprefix('tour_variants').' 
            WHERE tour_id = tour_variant_tour_id
        )
        
    )

WHERE tour_date_date > "2012-10-10"

GROUP BY tour_id

ORDER BY tour_variant_price DESC, tour_city_id ASC

LIMIT 10

Зараз він виконується на віртуальному хостингу за 0.0005 сек., цікаво що буде коли записів буде > 1000

4

Re: Допоможіть критикою SQL запиту

Сенс індексів - в тому, щоб час виконання запиту зростав логарифмічно при зростанні кількості запитів. Тобто збільшення обсягу в рази збільшує час запиту на мілісекунди. Так що до 100000 можете не хвилюватися.

Подякували: ozimok1

5

Re: Допоможіть критикою SQL запиту

koala написав:

Сенс індексів - в тому, щоб час виконання запиту зростав логарифмічно при зростанні кількості запитів. Тобто збільшення обсягу в рази збільшує час запиту на мілісекунди. Так що до 100000 можете не хвилюватися.

Дякую, але я вирішив питання шляхом створення view, так мені легше буде крутити ці дані як мені треба.

Подякували: koala1