exoexo
Member
Здравейте,
имам идея от PHP/mySQL, но чак специалист не съм. Сам съм си писал не прекалено сложни скриптове и сайтовете. Но се натъквам на един проблем кое да реша и кое е по-добре ...
С няколко думи като начало:
Метод 1. Дълга myQSL заявка от много по-малки обединени с UNION:
(заявка order by rand() limit 5) UNION (заявка order by rand() limit 5) UNION (заявка order by rand() limit 5) ...
като всяка заявка уви трябва да включва толкова неприятното order by rand() (всички сме наясно че rand() е мор за заявката, но няма избор, трябва да се извлекат само 5 случайни резултата. Като цяло голямата заявка връща крайния резултата без да е нужна допълнителна обработка - дирекно извеждаме резултатите.
Метод 2. Отделни по-малки заявки вместо обединената голяма. Всяка обаче връща всички резултати от търсенето. А после PHP shuffle() за да разбъркаме резултата на всяка заявка и вземаме първите 5 резултата и това всичко отива в един масив. Този масив вече е същия резултат като горната голяма заявка и извеждаме резултата.
Дилемата сега е кое е по-добре ... Определено една голяма заявка връща резултата директно от базата, не се налага да обработваме малките резултати с PHP. Метод(1) връща точния брой резултати от търсенето, докато малките, понеже нямат лимит и order се налага да върнат всички резултати за тяхното си търсене. Така малките реално връщат повече, излишно памет и т.н. Отделно после PHP трябва да ги размеси на случаен принцип за да вземем после 5 случайни резултата.
Сложих код да засече времето за изпълнение и засякох със 100 проби:
Метод 1: 0,278 секунди ! Почти 1/3 секунда докато извлече от базата и имаме крайния резултат от търсенето.
Метод 2: 0,082 секунди. Значително в пъти по-бързо извлича и обработва до същия краен резултат от търсенето.
Метод 2 определено е по-добър за потребителите като скорост. Също за SEO. Страницата зарежда осезаемо по-бързо.
Но забелязах че въпреки че е по-бърз Метод 2 се оказва може би повече товарещ ресурсите на машинката. За целта ще пусна и графиките:
- естествено с Метод 2 MySQL заявките да скочат доста.
- но се забелязва и повишението на CPU, заради обработките на малките от php/CPU
- натоварването (load average) на машината се повиши (макар че имах надежди да падне, след като вече нямаме rand() в заявките и всичко се обработва по-бързо. Вижда се, макар че тази графика не е много показателна, защото имах и други неща да върша и товареха излишно по време на Метод 1, та изглежда че Метод 2 не е много повече load спрямо Метод 1, но реално предните периоди средно load (Метод 1) = 0,90 ... а с Метод 2 средно load = 2,75.
Реално с Метод 2 исках да постигна по-бързо зареждане на страниците (което се получи осезаемо) и намаляване натоварването на машината, а да мога да поема повече трафик към сайтовете. Но реално се получи едно добро + едно зло. Скоростта е много по-добра, но пък натоварването се повиши и машината няма да поеме очакваните повече посетители.
И дилемата е дали да се върна на Метод 1, и да жертвам скоростта на страниците за сметка на поемането на повече посетители, или да жертвам трафика за сметка на скоростта ... Бавната скорост ще е негатив за SEO и самите посетители и ще загубя клиенти така, но пък с Метод 2 няма да има как сървъра така или иначе да поеме повече клиенти ... Не мога да сменям машината с по-мощна!
Някой ако е запознат с нещата, да препоръча нещо. Може би дори идеи за нов подход, Метод 3, с който да постигнем всички цели ? При нужда може да публикувам и самите кодове на php / mysql. (ПС: базата има индекси, това съм го оптимизира, заявките и обработката им са проблем)
имам идея от PHP/mySQL, но чак специалист не съм. Сам съм си писал не прекалено сложни скриптове и сайтовете. Но се натъквам на един проблем кое да реша и кое е по-добре ...
С няколко думи като начало:
Метод 1. Дълга myQSL заявка от много по-малки обединени с UNION:
(заявка order by rand() limit 5) UNION (заявка order by rand() limit 5) UNION (заявка order by rand() limit 5) ...
като всяка заявка уви трябва да включва толкова неприятното order by rand() (всички сме наясно че rand() е мор за заявката, но няма избор, трябва да се извлекат само 5 случайни резултата. Като цяло голямата заявка връща крайния резултата без да е нужна допълнителна обработка - дирекно извеждаме резултатите.
Метод 2. Отделни по-малки заявки вместо обединената голяма. Всяка обаче връща всички резултати от търсенето. А после PHP shuffle() за да разбъркаме резултата на всяка заявка и вземаме първите 5 резултата и това всичко отива в един масив. Този масив вече е същия резултат като горната голяма заявка и извеждаме резултата.
Дилемата сега е кое е по-добре ... Определено една голяма заявка връща резултата директно от базата, не се налага да обработваме малките резултати с PHP. Метод(1) връща точния брой резултати от търсенето, докато малките, понеже нямат лимит и order се налага да върнат всички резултати за тяхното си търсене. Така малките реално връщат повече, излишно памет и т.н. Отделно после PHP трябва да ги размеси на случаен принцип за да вземем после 5 случайни резултата.
Сложих код да засече времето за изпълнение и засякох със 100 проби:
Метод 1: 0,278 секунди ! Почти 1/3 секунда докато извлече от базата и имаме крайния резултат от търсенето.
Метод 2: 0,082 секунди. Значително в пъти по-бързо извлича и обработва до същия краен резултат от търсенето.
Метод 2 определено е по-добър за потребителите като скорост. Също за SEO. Страницата зарежда осезаемо по-бързо.
Но забелязах че въпреки че е по-бърз Метод 2 се оказва може би повече товарещ ресурсите на машинката. За целта ще пусна и графиките:
Реално с Метод 2 исках да постигна по-бързо зареждане на страниците (което се получи осезаемо) и намаляване натоварването на машината, а да мога да поема повече трафик към сайтовете. Но реално се получи едно добро + едно зло. Скоростта е много по-добра, но пък натоварването се повиши и машината няма да поеме очакваните повече посетители.
И дилемата е дали да се върна на Метод 1, и да жертвам скоростта на страниците за сметка на поемането на повече посетители, или да жертвам трафика за сметка на скоростта ... Бавната скорост ще е негатив за SEO и самите посетители и ще загубя клиенти така, но пък с Метод 2 няма да има как сървъра така или иначе да поеме повече клиенти ... Не мога да сменям машината с по-мощна!
Някой ако е запознат с нещата, да препоръча нещо. Може би дори идеи за нов подход, Метод 3, с който да постигнем всички цели ? При нужда може да публикувам и самите кодове на php / mysql. (ПС: базата има индекси, това съм го оптимизира, заявките и обработката им са проблем)