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

admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

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

Post by admin »

основная разница которую вижу - заменить на EXISTS
почему бы не попробовать, да

на какой базе пробовать? в личку базу не скинули еще
Don't forget to run script update
SpyCam
Posts: 736
Joined: Fri Oct 26, 2012 9:52 am

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

Post by SpyCam »

Скинул базу в личку
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

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

Post 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 монстротага
Don't forget to run script update
Post Reply