Page 2 of 2

Re: Тяжёлые запросы

Posted: Wed Aug 18, 2021 4:09 pm
by admin
основная разница которую вижу - заменить на EXISTS
почему бы не попробовать, да

на какой базе пробовать? в личку базу не скинули еще

Re: Тяжёлые запросы

Posted: Wed Aug 18, 2021 4:10 pm
by SpyCam
Скинул базу в личку

Re: Тяжёлые запросы

Posted: Thu Aug 19, 2021 1:19 pm
by admin
зашел на сервак и есть вопросы к этим изменениям
точнее обнаружилось интересный ньюанс, который описан в нете и который делает не таким обнозначным это изменение

да, если взять таг по котрому 70к галер то

Code: Select all

SELECT SQL_CALC_FOUND_ROWS  gs.gallery_id, gs.thumb_id, gi.sponsor_id, gi.content_count, gi.content_type, gs.total_shows, gs.total_clicks, gs.total_ctr, gt.thumb_url, gd.*, gi.content_count, gi.crop_profile_id, gs.activation_date, gi.added_date, gi.duration, gi.url, gi.gallery_total_shows, gi.sponsor_id, gi.source_url, gi.custom_gallery  FROM rot_gallery_stats1 as gs   
JOIN  rot_gallery_info as gi on gi.gallery_id = gs.gallery_id
JOIN  rot_gallery_data16 as gd on gd.gallery_id = gs.gallery_id
JOIN rot_gal2tag on rot_gal2tag.gallery_id = gs.gallery_id
JOIN rot_thumbs as gt on gt.thumb_id = gs.thumb_id
WHERE 1 = 1  AND gi.gallery_status = 'active'  AND gi.gallery_type = 0  and gs.best_thumb = 'yes'  
and gi.sponsor_id NOT IN ('3') and gs.group_id = 0  
AND gs.gallery_id IN (SELECT gallery_id FROM rot_gal2tag WHERE tag_id IN ('34386') ) 
group by gs.gallery_id, gs.thumb_id  ORDER BY  tested_thumb DESC,  gs.total_ctr DESC  LIMIT 0, 120;

и вариант с exists

Code: Select all

SELECT SQL_CALC_FOUND_ROWS  gs.gallery_id, gs.thumb_id, gi.sponsor_id, gi.content_count, gi.content_type, gs.total_shows, gs.total_clicks, gs.total_ctr, gt.thumb_url, gd.*, gi.content_count, gi.crop_profile_id, gs.activation_date, gi.added_date, gi.duration, gi.url, gi.gallery_total_shows, gi.sponsor_id, gi.source_url, gi.custom_gallery  FROM rot_gallery_stats1 as gs   
JOIN  rot_gallery_info as gi on gi.gallery_id = gs.gallery_id
JOIN  rot_gallery_data16 as gd on gd.gallery_id = gs.gallery_id
JOIN rot_gal2tag on rot_gal2tag.gallery_id = gs.gallery_id
JOIN rot_thumbs as gt on gt.thumb_id = gs.thumb_id
WHERE 1 = 1  AND gi.gallery_status = 'active'  AND gi.gallery_type = 0  and gs.best_thumb = 'yes'  
and gi.sponsor_id NOT IN ('3') and gs.group_id = 0  
AND EXISTS (SELECT 1 FROM rot_gal2tag WHERE ( rot_gal2tag.tag_id IN ( 4755 ) )  AND ( gs.gallery_id = rot_gal2tag.gallery_id )) 
group by gs.gallery_id, gs.thumb_id  ORDER BY  tested_thumb DESC,  gs.total_ctr DESC  LIMIT 0, 120;

то exists выигрывает

но если взять таг с небольшим кол-во галер например

Code: Select all

SELECT  SQL_CALC_FOUND_ROWS  gs.gallery_id, gs.thumb_id, gi.sponsor_id, gi.content_count, gi.content_type, gs.total_shows, gs.total_clicks, gs.total_ctr, gt.thumb_url, gd.*, gi.content_count, gi.crop_profile_id, gs.activation_date, gi.added_date, gi.duration, gi.url, gi.gallery_total_shows, gi.sponsor_id, gi.source_url, gi.custom_gallery  FROM rot_gallery_stats1 as gs   
JOIN  rot_gallery_info as gi on gi.gallery_id = gs.gallery_id
JOIN  rot_gallery_data1 as gd on gd.gallery_id = gs.gallery_id
JOIN rot_gal2tag on rot_gal2tag.gallery_id = gs.gallery_id
JOIN rot_thumbs as gt on gt.thumb_id = gs.thumb_id
WHERE 1 = 1  AND gi.gallery_status = 'active'  AND gi.gallery_type = 0  and gs.best_thumb = 'yes'  
and gi.sponsor_id NOT IN ('3') and gs.group_id = 0  
AND gs.gallery_id IN (SELECT gallery_id FROM rot_gal2tag WHERE tag_id IN ('117') ) 
group by gs.gallery_id, gs.thumb_id  ORDER BY  tested_thumb DESC,  gs.total_ctr DESC  LIMIT 0, 120;
VS

Code: Select all

SELECT SQL_CALC_FOUND_ROWS  gs.gallery_id, gs.thumb_id, gi.sponsor_id, gi.content_count, gi.content_type, gs.total_shows, gs.total_clicks, gs.total_ctr, gt.thumb_url, gd.*, gi.content_count, gi.crop_profile_id, gs.activation_date, gi.added_date, gi.duration, gi.url, gi.gallery_total_shows, gi.sponsor_id, gi.source_url, gi.custom_gallery  FROM rot_gallery_stats1 as gs   
JOIN  rot_gallery_info as gi on gi.gallery_id = gs.gallery_id
JOIN  rot_gallery_data1 as gd on gd.gallery_id = gs.gallery_id
JOIN rot_gal2tag on rot_gal2tag.gallery_id = gs.gallery_id
JOIN rot_thumbs as gt on gt.thumb_id = gs.thumb_id
WHERE 1 = 1  AND gi.gallery_status = 'active'  AND gi.gallery_type = 0  and gs.best_thumb = 'yes'  
and gi.sponsor_id NOT IN ('3') and gs.group_id = 0  
AND EXISTS (SELECT 1 FROM rot_gal2tag WHERE  rot_gal2tag.tag_id IN ( 117 ) AND  gs.gallery_id = rot_gal2tag.gallery_id ) 
group by gs.gallery_id, gs.thumb_id  ORDER BY  tested_thumb DESC,  gs.total_ctr DESC  LIMIT 0, 120;


то вариант без exits выполняется за 0.001 а вариант exists - 22 секунды



по тестам запрос без exists выиграывает на всех тагах кромее тех которых в базе больше 70к

их ИД

4755
12945
15184


что наталкиевет на мысль что это какое-то ограничение в мускле.

Что делать:

1. попробовать запросы в шеле что б повторить результаты и подтвердить ( или опровергнуть) этот тест

2. если с тестом все ок то либо искать что в мускле ограничивает либо удалить из базы эти 3 монстротага