1 2 3 4 5 6 7 | SELECT COUNT(*) FROM tabelA LEFT JOIN tabelB ON tabelA.id=tabelB.id_van_tabelA WHERE tabelA.kolomX=1 AND tabelB.kolomY=1 |
1 2 3 | id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tabelB ref PRIMARY,kolomY kolomY 1 const 123980 Using where 1 SIMPLE tabelA ref id_van_tabelA id_van_tabelA 5 database.tabelB.id,const 7 Using index |
dit performance technisch gezien de beste oplossing t.o.v. count queries. Je moet wel in de applicatie goed testen dat de tel kolom goed bij blijft, anders geef je valse waardes weer.quote:Op woensdag 26 juni 2013 11:59 schreef zoem het volgende:
Ja, een aparte counter bijhouden ipv COUNT(*) uitvoeren
Hij komt wel redelijk vaak voor in m'n slow query log.quote:Op woensdag 26 juni 2013 13:16 schreef KomtTijd... het volgende:
Is die query zo'n performance hit dan? Volgens mij moet die vrij snel kunnen met de juiste indexes, toch?
1 2 3 | # Query_time: 4.404715 Lock_time: 0.000632 Rows_sent: 1 Rows_examined: 401908 SET timestamp=1372244412; SELECT COUNT(*) AS num_comments FROM `comments` LEFT JOIN `topics` ON `topics`.`id`=`comments`.`topic_id` WHERE `comments`.`type`=1 AND `topics`.`isactive`='Y'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php $setopt_array = array(CURLOPT_TIMEOUT => $cronjobSettings['curl_timeout'], // in seconds CURLOPT_TIMEOUT_MS => $cronjobSettings['curl_timeout'] * 1000, // in ms CURLOPT_CONNECTTIMEOUT => $cronjobSettings['curl_timeout'], // in seconds CURLOPT_CONNECTTIMEOUT_MS => $cronjobSettings['curl_timeout'] * 1000, // in ms CURLOPT_NOBODY => false, // return body CURLOPT_VERBOSE => false, // Minimize logs CURLOPT_AUTOREFERER => true, // ? CURLOPT_FAILONERROR => true, // fail connection on error! CURLOPT_RETURNTRANSFER => true, // return (get) data CURLOPT_SSL_VERIFYHOST => false, // no certificate CURLOPT_SSL_VERIFYPEER => false, // no verify! CURLOPT_POST => false, // no posting CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_MAXREDIRS => 3, // max number of redirects to follow CURLOPT_DNS_USE_GLOBAL_CACHE => false, CURLOPT_DNS_CACHE_TIMEOUT => 2, /* CURLOPT_LOW_SPEED_LIMIT => 10, // in bytes CURLOPT_LOW_SPEED_TIME => $cronjobSettings['curl_timeout'], // in seconds CURLOPT_NOSIGNAL => 1, // exit if no signal is found */ ); ?> |
Het is de duur waarmee items in de DNS cache van cURL worden bewaard. Jij kiepert nu elke twee seconden je DNS cache leeg, waardoor je URLs heel vaak moet resolven. Als je vaak dezelfde host benaderd, dan is het wel handig om je cache langer gevult te laten.quote:Op woensdag 26 juni 2013 21:16 schreef Chandler het volgende:
Ik draai alles op het zelfde systeem (mijn test omgeving laptop) en heb nergens een DNS adres ingesteld whatsoever...
De timeout staat zo kort omdat deze dan toch al wel gevonden moet zijn? lijkt mij?maar zal hem eens verhogen en kijken of dat een verschil maakt..
Je wilt die DNS CACHE behouden, je zou eventueel als je echt lowlevel wilt gaan doen eerst resolven en dan pas aan CURL geven.quote:Op woensdag 26 juni 2013 20:29 schreef Chandler het volgende:
Ik loop tegen iets in CURL aan, voor vele URLS krijg ik een goede status terug van CURL maar sommige een foutmelding, deze foutmelding is vaak Could not resolve host: (nil); Host not found terwijl als ik met de browser naar deze url ga, bestaat deze wel!? en laad erg snel.
Mijn scriptje draait 25 URLS tegelijk met een timeout van 10 seconden.. Dus nu vraag ik mij af?! waar ligt dit aan? mijn opts zijn als volgt;
[ code verwijderd ]
Heeft iemand een idee waar de fout zou kunnen zitten? of is er bekend mee en weet er een work around/oplossing voor?
Ik zou hier in Inner Join gebruiken ipv een Left Join. Je zoekt expliciet naar rijen waar TabelB.KolomY een waarde heeft, dus voegt het gebruik van een left join niets toe.quote:Op woensdag 26 juni 2013 11:30 schreef mstx het volgende:
Ik heb zelf ook een vraagje, deze (simpele) query is soms traag:
[ code verwijderd ]
De explain zegt dit:
[ code verwijderd ]
Kan dat sneller?
Die indexes zitten er al op.quote:Op donderdag 27 juni 2013 00:47 schreef Boze_Appel het volgende:
[..]
Indexes erbij maken op type en isactive. Daar doe je de selecties op.
Maar dan selecteert 'ie toch ook rijen uit tabel B die niet gekoppeld zijn aan een rij uit tabel A?quote:Op donderdag 27 juni 2013 07:16 schreef Light het volgende:
[..]
Ik zou hier in Inner Join gebruiken ipv een Left Join. Je zoekt expliciet naar rijen waar TabelB.KolomY een waarde heeft, dus voegt het gebruik van een left join niets toe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT COUNT(*) FROM TabelA = 0.0002 sec SELECT COUNT(*) FROM TabelA LEFT JOIN TabelB................. = 0.25 sec SELECT COUNT(*) FROM TabelA INNER JOIN TabelB................. = 0.4 sec SELECT * FROM TabelA LEFT JOIN TabelB................. = 0.001 sec SELECT * FROM TabelA INNER JOIN TabelB................. = 0.001 sec SELECT * FROM TabelA = 0.0004 sec |
Nee.quote:Op donderdag 27 juni 2013 08:04 schreef mstx het volgende:
Maar dan selecteert 'ie toch ook rijen uit tabel B die niet gekoppeld zijn aan een rij uit tabel A?
Mijn code is altijd bugfreequote:Op donderdag 27 juni 2013 07:00 schreef Chandler het volgende:
Ik voer verder niets specifieks uit met curl, ik gebruik dezelfde opzet als die eerder door Slacker_nl is gegeven (DIG / [PHP/(My)SQL] voor dummies #109)
En het uitlezen van de DNS per URL zou een mogelijkheid zijn, al zou CURL deze url natuurlijk ook gewoon moeten kunnen vinden
juist hahaquote:
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT kolommen FROM tabel WHERE id IN ( SELECT id FROM tabel WHERE voorwaarde=1 ) |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |