Преработка на заявка.

sentenello

Registered
Здравейте, имам една заявка която има нужда от преработка, защото в момента е много бавна.

С тази заявка вземам мачовете и в същото време бъркам в друга таблица където намирам преводите на двата отбора и техния приоритет и подрежда резултатите по този приоритет.

Код:
SELECT 
 CONCAT( m.FTgd,  ' - ', m.FTgg ) AS ftresult, 
 m.hometeam AS domakina, 
 m.awayteam AS gosta, 
 e.countryBG as countrytoBG, 
 e.countryEN as countryflag, 
 e.leagueBG as ligatabg, 
 m.start_date, 
 (SELECT COALESCE(SUM( priority ), 60)  
FROM  `otbori` 
WHERE teamEN = domakina 
AND country !=  '' 
AND teamBG !=  '' 
AND  `priority` IS NOT NULL 
OR teamEN = gosta 
AND country !=  '' 
AND teamBG !=  '' 
AND  `priority` IS NOT NULL 
) AS prioritet 
FROM  `event` e 
LEFT JOIN  `sport` s ON e.sportid = s.id 
LEFT JOIN  `match` m ON e.id = m.event_id 
LEFT JOIN  `bettype` b ON m.id = b.match_id 
LEFT JOIN  `choicetype` c ON b.id = c.bet_id 
WHERE e.sportid =  '1' 
AND b.name =  'Match Result' 
AND m.FTgd IS NOT NULL 
AND m.FTgg IS NOT NULL 

AND e.countryBG !='' 
GROUP BY m.id 
ORDER BY m.start_date DESC,`prioritet` ASC  
LIMIT 10


Като цяло мисля че проблема ми идва от това че правя втори селект и той бави, но не знам как да бръкна в другата таблица и да взема приоритетите на двата отбора за да ги наредя по тях.
проблема според мен е тук

Код:
 (SELECT COALESCE(SUM( priority ), 60)  
FROM  `otbori` 
WHERE teamEN = domakina 
AND country !=  '' 
AND teamBG !=  '' 
AND  `priority` IS NOT NULL 
OR teamEN = gosta 
AND country !=  '' 
AND teamBG !=  '' 
AND  `priority` IS NOT NULL 
) AS prioritet

Със втората заявка вземам отборите 1 по 1, във втората таблицата като там си имам поле с приоритет което сумирам и подреждам по него. Някакви идеи как да го премахна тоя код и да постигна същия резултат или как да го направя правилно, защото със сигурност моето не е от най-правилните.
 
Както ти казах преди много време а и в много от темите ти! Претовари я и това я кара да бави повече отколкото ако беше ползвал някаква функция за обработка с една две леки заявки, който ти връщат някакъв масив. :)
 
Дай ми някакъв пример с код, за да мога да чатна какво имаш предвид. Ако успея да хвана какво имаш предвид, ще го преправя.
 
sentenello каза:
Дай ми някакъв пример с код, за да мога да чатна какво имаш предвид. Ако успея да хвана какво имаш предвид, ще го преправя.
Вече незнам кое за какво е добавяно и прочие. Заявката е тежка защото правиш обработки, които са ненужни в заявката. Представи си, че имаш две таблици. Кое е по-добре? В заявката да правиш вътрешни реконекциии и по сто пъти да въртиш информацията всеки път когато я викаш или да изведеш всичко от двете таблици в масиви и да си подреждаш логически нещата с php. SQL е много мощен език но понякога когато се прекали с излишните красотички се получава така. В случая ти правиш всичките проверки в заявката и то бави вместо да правиш проверките с php което винаги ще ти е сегментирано отделно. Ти вместо да програмираш на php вече си го направил на SQL...
 
Трябва ми просто някакъв пример, ако да речем имам


Код:
таблица1:
team1          team2
Arsenal        Monaco

Код:
таблица2:
teamEN      teamBG         PR
Arsenal       Арсенал         2
Monaco       Монако           3

Какъв трябва да е кода за да изведа всичките мачове от таблица 1, но в същото време да ги подреди по сумирания PR от таблица 2.
 
ем не е толкова сложно дай си полетата и ще ти го напиша с една заявка

нещо ей такова трябва да е, но тъй като имаш един куп джойнове не съм сигурен дали ще тръгне от първия път:

PHP:
SELECT 
 CONCAT( m.FTgd,  ' - ', m.FTgg ) AS ftresult, 
 m.hometeam AS domakina, 
 m.awayteam AS gosta, 
 e.countryBG as countrytoBG, 
 e.countryEN as countryflag, 
 e.leagueBG as ligatabg, 
 m.start_date, SUM(o.`priority`) as prioritet
 
FROM  `event` e 
LEFT JOIN  `sport` s ON e.sportid = s.id 
LEFT JOIN  `match` m ON e.id = m.event_id  AND m.FTgd IS NOT NULL  AND m.FTgg IS NOT NULL 
LEFT JOIN  `bettype` b ON m.id = b.match_id  AND b.name = 'Match Result' 
LEFT JOIN  `choicetype` c ON b.id = c.bet_id 
LEFT JOIN `otbori` o ON o.teamEN = m.hometeam AND o.country !=  '' AND o.teamBG !=  '' AND  o.`priority` IS NOT NULL OR o.teamEN = m.awayteam  AND o.country !=  '' AND o.teamBG !=  '' AND  o.`priority` IS NOT NULL

GROUP BY m.id 
HAVING e.sportid =  '1' AND e.countryBG !='' 
ORDER BY m.start_date DESC, prioritet ASC  
LIMIT 10
 
embaka заявката която съм дал в първия пост зарежда около 7 секунди, а тази която ти си ми написал зарежда 17сек. Дори приоритетите не смята правилно, но това мисля че лесно ще се оправи, с някоя клауза някъде. По-важното ми е кода да заработи максимално бързо
 
Здравей,
пусни структурата на таблиците. Индекси имаш ли ?
dakata__92 е прав но от части. Ако таблиците са големи не е удачно да се ползват масиви.
 
sentenello каза:
embaka заявката която съм дал в първия пост зарежда около 7 секунди, а тази която ти си ми написал зарежда 17сек. Дори приоритетите не смята правилно, но това мисля че лесно ще се оправи, с някоя клауза някъде. По-важното ми е кода да заработи максимално бързо


Заявката ти е написана меко казано с г*за ми, искаше с една заявка да става всичко доколкото си спомням това си дал в описанието, тва какво изчислява си е твой проблем, оправяй си нещата. Заявката работи ли, работи, значи всичко е точно. Имаш едни глупави проверки за празни полета, които въобще не трябва да са така написани. Това че ползваш LEFT JOIN не значи, че добре са ти структирирани връзките, не може да правиш LEFT JOIN на таблици отзад напред, има последователност, която трябва да се спазва, при теб тя липсва, писани са както ти е дошло.

LEFT JOIN `match` m ON e.id = m.event_id

това трябва да е обратното

LEFT JOIN `match` m ON m.event_id = e.id, както и всички останали написани по тоя начин


А заявката бави, защото SUM е тежка операция, второ имаш oreder по поле, от тая операция SUM, 3-то когато се използва HAVING той е по-бавен от where, тъй като създава темпова таблица, но ако заявката ти е за много записи ще има предимство пред твоята заявка и не на последно място правилни ключове на таблиците. То като гледам дори полетата ти не са структурирани правилно
 
imagination каза:
Здравей,
пусни структурата на таблиците. Индекси имаш ли ?
dakata__92 е прав но от части. Ако таблиците са големи не е удачно да се ползват масиви.
Не е точно така. Проблема не ти е в масива ти когато правиш някаква заявка към базата всичко ти се мръща в масив, за тях говорех сега. По принцип един SQL от типа Селект фром лере с едно две условия е удачно. Но когато започнеш сървърно да прескачаш през две три таблици да реконектваш всеки път когато правиш селекта и всичкото това започва да бави, докато ако си направиш селектите и си върнеш масива тоест тази да я разбиеш на две три по-прости заявки и с php си направиш проверките и сортирането повярвай ми ще стане доооста по-олекотено и ще имаш възможността да бъркаш по отделните сегменти в сортирането и така нататък да ги ускоряваш и прочие докато в момента просто със тази заявка правиш всичкото сортиране при инициализацията на заявката след което я интерираш с цикъл. :)
 
embaka какво се товариш бе човек ?? Нали за това е тоя форум, за да се учат хората които не разбират. От такива знаещи като теб, мога да науча нещо, но само ако чета през редовете и не ти чета тъпите глупости да се ядосвам защо въобще си мисля че някой може да обясни без да се ядосва.

Да съм казал че е правилна заявката ?
В моята НУБСКА заявка няма HAVING.

П.С. И като не съм я структурирал правилно, кажи кое е грешното и кое е правилното.

Peace
:?:
 
sentenello каза:
embaka какво се товариш бе човек ?? Нали за това е тоя форум, за да се учат хората които не разбират. От такива знаещи като теб, мога да науча нещо, но само ако чета през редовете и не ти чета тъпите глупости да се ядосвам защо въобще си мисля че някой може да обясни без да се ядосва.

Да съм казал че е правилна заявката ?
В моята НУБСКА заявка няма HAVING.

П.С. И като не съм я структурирал правилно, кажи кое е грешното и кое е правилното.

Peace
:?:


Ми правиш тъпи коментари, че с твоята заявка нещата се случвали по бързо в сравнение с тая която съм ти дал. Ти правиш тъпите изказвания и накрая аз съм се товарил. Ми ще се товаря, защото не си си мръднал мозъка, за да го промениш и тестваш преди да правиш глупав коментар. Копи, пейст, рун на заявката и толкова. После бави..... Заради такива изказвания като твойто не останаха хора да имат желание да отговарят на такива не знаещи като тебе, щото не стига че не знаеш, питаш отговарят ти, а на края плюеш. Има гугъл, търси решение на въпросите си там
 
Като цяло и аз не получавам някаква по-различна заявка, от тази на колегата embaka. Не претендирам, че ще е по-бърза, много зависи какви данни имаш в отделните таблици. Пробвай един "експлейн" на заявката да пуснеш, може да излезе нещо. Или направо пусни резултата от "EXPLAIN SELECT ...".
Така и не стана ясно полета имат ли индекси, нямат ли.
Провери дали е зададен индекс на полетата по които имаш условия. дори и на start_date, при сортирането ще спестиш някоя милисекунда.

[sql]
SELECT Concat(m.ftgd, ' - ', m.ftgg) AS ftresult,
m.hometeam AS domakina,
m.awayteam AS gosta,
e.countrybg AS countrytoBG,
e.countryen AS countryflag,
e.leaguebg AS ligatabg,
m.start_date,
(SELECT Sum(priority) FROM `otbori` WHERE (teamen = domakina OR teamen = gosta) AND country != '' AND teambg != '' AND `priority` IS NOT NULL) AS prioritet
FROM `event` e
LEFT JOIN `sport` s ON e.sportid = s.id
LEFT JOIN `match` m ON e.id = m.event_id AND m.ftgd IS NOT NULL AND m.ftgg IS NOT NULL
LEFT JOIN `bettype` b ON m.id = b.match_id AND b.name = 'Match Result'
LEFT JOIN `choicetype` c ON b.id = c.bet_id

WHERE e.sportid = '1' AND e.countrybg != ''
GROUP BY m.id ORDER BY m.start_date DESC, `prioritet` ASC LIMIT 10
[/sql]
[/sql]
 
embaka мислиш ли че не съм пробвал всичко за което се сетя и всичко за което намеря в интернет (което мога да разбера) ?

И само да те осведомя, че кода ти го пробвах сутринта докато си пиех кафето набързо, само за да видя дали ще има някака разлика с моя. Реших че ще е добре да кажа, че работи по-бавно, дори без да съм се опитвал да го наглася. Освен това не съм казвал че искам всичко да ми става чрез заявката. Ако има друг вариант който е по-правилен или по-добър, мога да го направя така, стига да схвана какъв точно е.

варианта който ми предлага даката , мисля че може да се окаже добър, но за да го разбера какво точно има в предвид, ми трябва някакъв малък пример.

Ако правилно съм го разбрал, трябва да изведа всичките резултати , и после когато вече имам всичко, да сортирам масива с пхп код ?

@imagination
после като ми остане време, ще погледна и твоя код, и какво си написал
 
sentenello каза:
embaka мислиш ли че не съм пробвал всичко за което се сетя и всичко за което намеря в интернет (което мога да разбера) ?

И само да те осведомя, че кода ти го пробвах сутринта докато си пиех кафето набързо, само за да видя дали ще има някака разлика с моя. Реших че ще е добре да кажа, че работи по-бавно, дори без да съм се опитвал да го наглася. Освен това не съм казвал че искам всичко да ми става чрез заявката. Ако има друг вариант който е по-правилен или по-добър, мога да го направя така, стига да схвана какъв точно е.

варианта който ми предлага даката , мисля че може да се окаже добър, но за да го разбера какво точно има в предвид, ми трябва някакъв малък пример.

Ако правилно съм го разбрал, трябва да изведа всичките резултати , и после когато вече имам всичко, да сортирам масива с пхп код ?

@imagination
после като ми остане време, ще погледна и твоя код, и какво си написал
Ами колега, тези варянти ти ги пишех по темите преди време. Просто се разрови и ги направи така както съм ти описвал. :) Още тогава те предопредих за този проблем :)
 
Виждам, че имаш доста теми на тази тематика - залагания и пр..
Също виждам, че имаш теми с parse-ване на данни от някакво API.

Да разбираме ли, че използваш някакво API за входни данни, които искаш да използваш в своето приложение?
 
sentenello каза:
embaka мислиш ли че не съм пробвал всичко за което се сетя и всичко за което намеря в интернет (което мога да разбера) ?

И само да те осведомя, че кода ти го пробвах сутринта докато си пиех кафето набързо, само за да видя дали ще има някака разлика с моя. Реших че ще е добре да кажа, че работи по-бавно, дори без да съм се опитвал да го наглася. Освен това не съм казвал че искам всичко да ми става чрез заявката. Ако има друг вариант който е по-правилен или по-добър, мога да го направя така, стига да схвана какъв точно е.

варианта който ми предлага даката , мисля че може да се окаже добър, но за да го разбера какво точно има в предвид, ми трябва някакъв малък пример.

Ако правилно съм го разбрал, трябва да изведа всичките резултати , и после когато вече имам всичко, да сортирам масива с пхп код ?

@imagination
после като ми остане време, ще погледна и твоя код, и какво си написал


Добре аз те разбирам, че искаш да вземеш данните, но започни от правилното създаване на полетата по таблиците и тяхното индексиране, за да може заявката ти да стане бърза и премахни излишни проверки, използвай иф елс в заявката и проблема ти ще се реши без да правиш 3-4 по-малки заявки, защото ако надробиш заявките на 3-4, а имаш 1000 резултата и в цикъла правиш по 3,4 умножи и ще получиш 3,4к заявки, по тоя начин също гънеш mysql сървъра. Ако пък добавиш и 100 потребителя онлайн и тея 3,4к заявки ще станат колко хиляди :) Никой не може да ти каже кой е най-правилния начин да постигнеш това което искаш, защото всичко е пред теб, ние само гадаем какво се случва в кода ти
 
eLite каза:
Виждам, че имаш доста теми на тази тематика - залагания и пр..
Също виждам, че имаш теми с parse-ване на данни от някакво API.

Да разбираме ли, че използваш някакво API за входни данни, които искаш да използваш в своето приложение?

Информацията която използвам я взимам от free xml файл на даден букмейкър. След като я взема си я вкарвам според зависи от информацията, в различни таблици в моя БД и оттам вече си извеждам което искам аз.

Ето линка, за да разбереш какво вземам.
http://xml.cdn.betclic.com/odds_en.xml
 
embaka каза:
Добре аз те разбирам, че искаш да вземеш данните, но започни от правилното създаване на полетата по таблиците и тяхното индексиране, за да може заявката ти да стане бърза и премахни излишни проверки, използвай иф елс в заявката и проблема ти ще се реши без да правиш 3-4 по-малки заявки, защото ако надробиш заявките на 3-4, а имаш 1000 резултата и в цикъла правиш по 3,4 умножи и ще получиш 3,4к заявки, по тоя начин също гънеш mysql сървъра. Ако пък добавиш и 100 потребителя онлайн и тея 3,4к заявки ще станат колко хиляди :) Никой не може да ти каже кой е най-правилния начин да постигнеш това което искаш, защото всичко е пред теб, ние само гадаем какво се случва в кода ти

Като се прибера, ще дам точната структура на таблиците ми в БД, за да стане по-ясно, как мисля аз че е правилно и как съм го направил в момента.
 
sentenello каза:
eLite каза:
Виждам, че имаш доста теми на тази тематика - залагания и пр..
Също виждам, че имаш теми с parse-ване на данни от някакво API.

Да разбираме ли, че използваш някакво API за входни данни, които искаш да използваш в своето приложение?

Информацията която използвам я взимам от free xml файл на даден букмейкър. След като я взема си я вкарвам според зависи от информацията, в различни таблици в моя БД и оттам вече си извеждам което искам аз.

Ето линка, за да разбереш какво вземам.
http://xml.cdn.betclic.com/odds_en.xml

УЖАС! Само определени спортове и event-и ли искаш или всичко?

Други източници не си ли гледал?

http://www.pinnaclesports.com/en/api/manual

Много по-развито API...
 

Back
Горе