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 ) |
Als het nou op een ander veld was het helemaal niet zo gek geweest, voorbeeld is een werknemerstabel waarbij er een veld leidinggevende is welke correspondeerd met het werknemerId.quote:Op donderdag 27 juni 2013 13:39 schreef mstx het volgende:
Ik kwam net weer eens een prachtige query tegen van een oud-collega:
[ code verwijderd ]
(het is dezelfde tabel)
Als je er niet mee gaat rekenen, waarom sla je ze dan op?quote:Op zondag 30 juni 2013 15:29 schreef Pakspul het volgende:
Ik wil temperatuur in een Mysql database opslaan, maar zit even te twijfelen wat ik het beste kan gebruiken. Float, Double, Decimal of Real?
Mijn eerste keuze zou een float zijn, maar ik weet dat als je geld opslaat in een DB dat je Decimal moet gebruiken, aangezien temperatuur aardig op geld lijkt (ook twee cijfers achter de komma [in ieder geval hoe ik het aangeleverd krijg]). Zou ik zeggen Decimal is een veilig keuze, maar ik ga niet rekenen met deze cijfers, dus Float zou volgens mij ook wel kunnen.
Kan iemand de beste keuze kunnen uitleggen en wat standaarden hiervoor zijn?
Niet mee rekenen in de zin van ik ga geen percentages er over heen gooien om daarna totalen te gaan berekenen. Meer datamining, zodat ik later kan kijken of ik ze kan gebruiken om beslissingen op te maken.quote:Op zondag 30 juni 2013 15:42 schreef Boze_Appel het volgende:
[..]
Als je er niet mee gaat rekenen, waarom sla je ze dan op?
Arduino zit er achter, vet dure apparatuur dusquote:Anyway, gewoon een decimal (4,1) gebruiken. Tenzij je dik dure apparatuur hebt is temperatuur opslaan met twee decimalen vrij onzinnig.
Als je twee decimalen aangeleverd krijgt, waarom zou je er dan maar 1 opslaan?quote:Op zondag 30 juni 2013 15:42 schreef Boze_Appel het volgende:
[..]
Als je er niet mee gaat rekenen, waarom sla je ze dan op?
Anyway, gewoon een decimal (4,1) gebruiken. Tenzij je dik dure apparatuur hebt is temperatuur opslaan met twee decimalen vrij onzinnig.
Kan opzich natuurlijk wel, maar het is een beetje als een rondje hardlopen op de cm nauwkeurig opslaan. Het gaat om gemeten temperatuur door een apparaat van nog geen tientje. Ik denk dat je al blij moet zijn als dat ding hele graden nauwkeurig doet, laat staan honderdste graden.quote:Op zondag 30 juni 2013 23:33 schreef Light het volgende:
[..]
Als je twee decimalen aangeleverd krijgt, waarom zou je er dan maar 1 opslaan?
quote:Op zondag 30 juni 2013 23:38 schreef Boze_Appel het volgende:
[..]
Kan opzich natuurlijk wel, maar het is een beetje als een rondje hardlopen op de cm nauwkeurig opslaan. Het gaat om gemeten temperatuur door een apparaat van nog geen tientje. Ik denk dat je al blij moet zijn als dat ding hele graden nauwkeurig doet, laat staan honderdste graden.
Ik ben van mening dat je data op basis van relevantie en toepasbaarheid op moet slaan en niet data moet bewaren 'omdat het kan'.
Dat ligt er m.i. ook aan wat je meet. Kamertemperatuur in honderdste graden is niet echt zinnig maar bij een experiment kan die nauwkeurigheid wel nuttig zijn.quote:Op zondag 30 juni 2013 23:38 schreef Boze_Appel het volgende:
[..]
Kan opzich natuurlijk wel, maar het is een beetje als een rondje hardlopen op de cm nauwkeurig opslaan. Het gaat om gemeten temperatuur door een apparaat van nog geen tientje. Ik denk dat je al blij moet zijn als dat ding hele graden nauwkeurig doet, laat staan honderdste graden.
Ik ben van mening dat je data op basis van relevantie en toepasbaarheid op moet slaan en niet data moet bewaren 'omdat het kan'.
Eens, maar als er al aangegeven wordt er niet mee te willen rekenen kan je 'experiment' meteen wel uitsluiten.quote:Op maandag 1 juli 2013 00:09 schreef Light het volgende:
Dat ligt er m.i. ook aan wat je meet. Kamertemperatuur in honderdste graden is niet echt zinnig maar bij een experiment kan die nauwkeurigheid wel nuttig zijn.
Lees je hem tegelijkertijd van de harde schijf af? Dat gaat namelijk altijd langzaam. Eerst in het geheugen stoppen en daarna pas checken met regex.quote:Op woensdag 3 juli 2013 10:33 schreef Chandler het volgende:
God wat is het toch vervelend om regexjes op grote bestanden af te sturen![]()
Heb een 2MB bestand en wilde deze eerst in 1x door preg_match_all halen, nou daar had PHP niet echt zin in en koste ruim een UUR!! lol, nu heb ik een benchmark gedaan om het bestand in stukken te verdelen en dat komt de snelheid ten goede..
stukken van 25000 (etc) + 500 extra (straks mis ik nog wat)
25500 bytes per keer - 709 seconden
10500 bytes per keer - 239 seconden
5500 bytes per keer - 130 seconden
3000 bytes per keer - 54 seconden
1500 bytes per keer - 22 secondenraar, kan iemand mij uitleggen waarom dit zo langzaam gaat?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $t = time(); $parseCls = new parse(); $size = 1000; echo '<pre>'; if (strlen($document) > $size) { $loop = ceil(strlen($document) / $size); $start = 0; for ($x = 0; $x < $loop; $x++) { echo date("Y-m-d H:i:s") . ' - ' . ($x * $size) . ' - ' . ($size + 500) . ' of ' . strlen($document) . '<br />'; $start = substr($document, $x * $size, $size + 500); $parseCls->parse($start); } } else { print_r($parseCls->parse($document)); } echo '</pre>'; ?> |
Some people, when confronted with a problem, thinkquote:Op woensdag 3 juli 2013 10:33 schreef Chandler het volgende:
God wat is het toch vervelend om regexjes op grote bestanden af te sturen![]()
Heb een 2MB bestand en wilde deze eerst in 1x door preg_match_all halen, nou daar had PHP niet echt zin in en koste ruim een UUR!! lol, nu heb ik een benchmark gedaan om het bestand in stukken te verdelen en dat komt de snelheid ten goede..
stukken van 25000 (etc) + 500 extra (straks mis ik nog wat)
25500 bytes per keer - 709 seconden
10500 bytes per keer - 239 seconden
5500 bytes per keer - 130 seconden
3000 bytes per keer - 54 seconden
1500 bytes per keer - 22 secondenraar, kan iemand mij uitleggen waarom dit zo langzaam gaat?
Gewoon telkens een x-aantal blokken lezen, dan parsen, dan weer verder lezen, dan parsen, etc etc. http://php.net/manual/en/function.fread.php Welk even flocken, anders gaan er andere processen naar willen schrijven en gaat het (mogelijk) fout.quote:Op woensdag 3 juli 2013 10:37 schreef Juicyhil het volgende:
[..]
Lees je hem tegelijkertijd van de harde schijf af? Dat gaat namelijk altijd langzaam. Eerst in het geheugen stoppen en daarna pas checken met regex.
Ja en nee. Dat hangt compleet van de gebruikte regex af. Een inefficiente regex kan (onnodig) lang duren, zeker als het om veel karakters gaat (oa ivm backtracking). Wat voor regex pattern gebruik je?quote:Op woensdag 3 juli 2013 10:33 schreef Chandler het volgende:
raar, kan iemand mij uitleggen waarom dit zo langzaam gaat?
Alles achter de @ kan je hiertegen aangooien:quote:Op woensdag 3 juli 2013 12:00 schreef Chandler het volgende:
"/[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}/i"
Om emails te parsen!ik krijg links met documenten aangeleverd die ik moet omzetten naar een database tabel...
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | { # The following is stolen from: # http://cpansearch.perl.org/src/CREIN/Regexp-Common-dns-0.00_01/lib/Regexp/Common/dns.pm # So we don't need to install the dependency which is not in the Debian repository # sub _domain { my %flags = @_; my $sep = '\.'; my $letter = '[a-zA-Z]'; my $let_dig = '[a-zA-Z0-9]'; my $let_dig_hyp = '[-a-zA-Z0-9]'; my %labels = ( 1035 => "(?:$letter(?:$let_dig|$let_dig_hyp\{1,61}$let_dig)?)", 1123 => "(?:(?:$let_dig|$let_dig$let_dig_hyp*$let_dig)$sep)*(?:$let_dig|$let_dig$let_dig_hyp*$let_dig)", 2181 => '[^.]{1,63}', hybrid => '[a-zA-Z0-9_-]{1,63}' ); $flags{'-rfc'} ||= 1035; my $label = $labels{$flags{'-rfc'}} || die("Unknown DNS RFC: $flags{'-rfc'}"); if ($flags{'-rfc'} ne 2181 && exists $flags{'-wildcard'} && not defined $flags{'-wildcard'}) { $label = "(?:\\*|$label)"; } my $quant = '*'; if ($flags{'-minlabels'}) { $quant = '{' . ($flags{'-minlabels'} - 1) . ',}'; } return qr/^(?:$label$sep)$quant$label$sep?$/; } my $fqdn_regexp = _domain(-rfc => 1123, -minlabels => 2); use constant VALID_FQDN => sub { my $fqdn = shift; if ($fqdn && $fqdn =~ m/$fqdn_regexp/) { $fqdn =~ s/\.$//; return 0 if (length($fqdn) > 255); return 0 if (grep { length($_) > 63 } split(/\./, $fqdn)); return 1; } return 0; }; } |
quote:Op woensdag 3 juli 2013 13:54 schreef zoem het volgende:
En voor je het weet heb je zoiets: http://www.perlmonks.org/?node_id=393809![]()
Ik zou het lekker simpel houden. Als het even kan zou ik filter_var() (php >= 5.2.0) erbij betrekken voor de validatie.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php public function compareValues($type,$compare1,$compare2){ $count1 =0; $count2 =0; switch ($type) { case 'Doctype': $var = '\$v->data->doctype'; break; default: break; } foreach($this->selectedData as $k=>$v){ $val = 'empty'; eval('$val = '.$var.';'); if($val && $val === $compare1)++$count1; if($val && $val === $compare2)++$count2; } return $count1.$count2; } ?> |
| 1 2 3 4 5 6 7 | SELECT `spider`.`id` AS spiderID, `spider`.`url` AS spiderURL, `spider`.`failed` AS spiderFailed FROM `spider` WHERE `spider`.`project_id` =7 AND `spider`.`processed` =0 LIMIT 1 |
| 1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE IF NOT EXISTS `spider` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `project_id` bigint(20) unsigned NOT NULL, `url` varchar(255) NOT NULL, `processed` tinyint(1) NOT NULL DEFAULT '0', `failed` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `project_id_2` (`project_id`,`url`), KEY `failed` (`failed`), KEY `project_id` (`project_id`,`processed`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=103771614 ; |
Natuurlijk niet het antwoord wat je zoekt. Maar je kan het via een omweg ook gewoon orderen binnen php lijkt me.quote:Op donderdag 11 juli 2013 23:42 schreef Chandler het volgende:
Ik heb een query die raar doet wanneer ik gebruik wil maken van ORDER BY.
Zonder order by is deze query 0.0043 seconden, met ORDER BY `failed` kost deze query ruim 23 seconden!?
[ code verwijderd ]
Als ik een URL laad wil ik het liefst URLS laden die ik nog niet heb gehad (processed = 0) maar liefst ook de URLS die nog niet gelezen en mislukt zijn. Met huidige query lees ik deze 3x achter elkaar alvorens processed op 1 te zetten, alleen nu wilde ik met ORDER BY 'failed' ASC de URLS met een waarde die groter is dan 0 achter aan zetten en de URLS met waarde van 0 natuurlijk vooraan... oftewel eerst uitlezen.
Tabel
[ code verwijderd ]
Iemand een idee? oh ik heb maar 17m regeltjes....
Dat gaat je geheugen kostenquote:Op donderdag 11 juli 2013 23:49 schreef Purplesparks het volgende:
[..]
Natuurlijk niet het antwoord wat je zoekt. Maar je kan het via een omweg ook gewoon orderen binnen php lijkt me.
True dat, maar een potentiële mogelijkheid als chandler niet de oplossing weet te vinden van de lange order tijd.quote:
Neem anders eens failed op in je where-clause. Dan hoeft hij in wat minder rijen te sorteren.quote:Op donderdag 11 juli 2013 23:42 schreef Chandler het volgende:
Ik heb een query die raar doet wanneer ik gebruik wil maken van ORDER BY.
Zonder order by is deze query 0.0043 seconden, met ORDER BY `failed` kost deze query ruim 23 seconden!?
[ code verwijderd ]
Als ik een URL laad wil ik het liefst URLS laden die ik nog niet heb gehad (processed = 0) maar liefst ook de URLS die nog niet gelezen en mislukt zijn. Met huidige query lees ik deze 3x achter elkaar alvorens processed op 1 te zetten, alleen nu wilde ik met ORDER BY 'failed' ASC de URLS met een waarde die groter is dan 0 achter aan zetten en de URLS met waarde van 0 natuurlijk vooraan... oftewel eerst uitlezen.
Tabel
[ code verwijderd ]
Iemand een idee? oh ik heb maar 17m regeltjes....
Valt erg mee hoor als je het een beetje slim aanpakt, aangenomen dat er gewerkt wordt met een beperkte subset van de 17M rows (processed=0). Maar goed, de query optimaliseren heeft natuurlijk de voorkeur.quote:
Gaat het ook zo traag wanneer je order by gebruikt in andere tabellen of alleen in deze?quote:Op vrijdag 12 juli 2013 11:35 schreef Chandler het volgende:
Ja, en het rare is dat er geen filesort gebruikt wordt, dus het orderen gebeurd toch echt wel in het geheugen (als ik check met explain). Dacht zelf ook dat ik de indexes goed had en dat blijkt wel, maar het vervelende blijft dat ik per query met order by een kleine 1000x zolang bezig ben...
Maar hebben jullie tips? oh en de beperkte set van 17m rows zijn in dit geval zo'n 3,5m rows
Geen idee, rest van de tabellen zijn niet zo groot dus daar zal het allemaal wel meevallen... en daar zit het tijdsverlies in deze niet in....quote:Op vrijdag 12 juli 2013 11:38 schreef Purplesparks het volgende:
[..]
Gaat het ook zo traag wanneer je order by gebruikt in andere tabellen of alleen in deze?
Okee, wilde alleen uitsluiten dat het om de 1 of andere vage reden niet aan je sql prog zelf lag.quote:Op vrijdag 12 juli 2013 11:40 schreef Chandler het volgende:
[..]
Geen idee, rest van de tabellen zijn niet zo groot dus daar zal het allemaal wel meevallen... en daar zit het tijdsverlies in deze niet in....
Mijn stiefpa had een programma voor een bedrijf ontwikkeld, bij externe resultaten van bepaalde queries opvragen duurde het soms ook wel tot een minuut lang. Terwijl als hij het daar ter plekke testte een seconde of nog minder. Weet niet exact waar het aanlag maar hij heeft het opgelost. Hij maakte trouwens gebruik van delphi pascal in combinatie met een sql variant.quote:Op vrijdag 12 juli 2013 13:11 schreef Chandler het volgende:
Zowel lokaal als online test ik dit, aangezien mijn lokale test omgeving maar uit zo'n 5m regels bestaat... maar goed, het is een laptop en de online server heeft nogal wat meer power en daar is het zelfs sloom
Query test ik via phpmyadmin, domweg omdat het gemakkelijk is!
En wat doet een index op je WHERE clause én ORDER BY field(s)?quote:Op vrijdag 12 juli 2013 11:35 schreef Chandler het volgende:
Ja, en het rare is dat er geen filesort gebruikt wordt, dus het orderen gebeurd toch echt wel in het geheugen (als ik check met explain). Dacht zelf ook dat ik de indexes goed had en dat blijkt wel, maar het vervelende blijft dat ik per query met order by een kleine 1000x zolang bezig ben...
Maar hebben jullie tips? oh en de beperkte set van 17m rows zijn in dit geval zo'n 0,5m rows
@zoom:
Zonder order by
1 SIMPLE spider ref project_id_2,project_id project_id 9 const,const 536370
Met order by
1 SIMPLE spider index project_id_2,project_id failed 1 NULL 39 Using where
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |