Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: запрос и производительность
 
 автор: Импекс   (26.07.2010 в 10:13)   письмо автору
18.1 Кб
 
 

Здравствуйте, оцените, пожалуйста запрос на производительность

SELECT DISTINCT firma.name as fname ,firma.znak as znak,firma.x as x,firma.y as y,firma.id as fid,firma.adress,firma.email,firma.url,firma.home,firma.telefon 
FROM firma
LEFT JOIN tovar ON tovar.id_firm=firma.id
LEFT JOIN rubrik_tovar ON rubrik_tovar.id_tovar=tovar.id
INNER JOIN 
 (SELECT g1.id FROM grtovar_new g1 
 INNER JOIN grtovar_new g2 on g1.id=g2.id 
 WHERE g2.id_parent=19) 
 t0 ON t0.id=rubrik_tovar.id_rubrik
WHERE firma.registr=1  
ORDER by fname asc
limit 0, 30


В прикрепленном файле EXPLAIN запроса

  Ответить  
 
 автор: sms-send   (26.07.2010 в 12:38)   письмо автору
 
   для: Импекс   (26.07.2010 в 10:13)
 

SELECT g1.id FROM grtovar_new g1  
 INNER JOIN grtovar_new g2 on g1.id=g2.id  
 WHERE g2.id_parent=1
INNER JOIN тут зачем нужен?
SELECT g1.id FROM grtovar_new g1
 WHERE g1.id_parent=1 AND g1.id IS NOT NULL

Весь этот подзапрос можно заменить обычным внутренним присоединением таблицы grtovar_new с вынесением условия во внешний запрос, тогда из плана должна уйти derived table.

Оба LEFT JOIN не имеют смысла, когда на крайнюю присоединённую таблицу присоединяют ещё одну таблицу с помощью INNER JOIN по обычному оператору равенства, выборка в этом случае должна получиться такой же, как если бы везде был INNER JOIN.

Кейворд DISTINCT с таким внушительным перечислением наводит на мысли, что тут что то совсем не так.

По explain'у: temporary table, filesort - от всего этого желательно по мере возможности избавляться.

  Ответить  
 
 автор: Импекс   (26.07.2010 в 15:15)   письмо автору
 
   для: sms-send   (26.07.2010 в 12:38)
 

Вы верно заметили про distinct. Из за него и происходят временные таблицы. В следующем запросе их уже нет, но выводятся дублирующие записи таблицы firm

SELECT
    f.name AS fname,
    f.znak AS znak,
    f.id AS fid,
    f.adress,
    f.email,
    f.url,
    f.home,
    f.telefon
FROM
    firma AS f
    LEFT JOIN tovar AS t
        ON t.id_firm = f.id
    LEFT JOIN rubrik_tovar AS r
        ON r.id_tovar = t.id
    right JOIN grtovar_new AS g
        ON g.id = r.id_rubrik
        AND g.id_parent = '19'
WHERE
    f.registr = 1
LIMIT
    0, 30;


например :

фирма 1
фирма 1
фирма 1
фирма 2
фирма 2
фирма 3

как мне исправиться последний запрос

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования