bijna een snelle edit gedaan...heb ik dus gedaanquote:Op maandag 29 december 2014 22:22 schreef Monolith het volgende:
value => image in plaats van andersom.
dan moet je eerst een readdir doen van de root map, door de mappen loopen en per map de afbeeldingen ophalen en de eerste tonen.quote:Op maandag 29 december 2014 22:23 schreef MrNiles het volgende:
[..]
bijna een snelle edit gedaan...heb ik dus gedaan
maar dan krijg ik alleen de eerste foto van de eerste folder
Die had ik al eens geprobeerd, maar dan krijg ik een loop van foto1 uit folder1, geen andere foldersquote:
Zeker waarquote:Laat TS ff lekker kutten met arrays, anders snapt hij het nooit
https://github.com/fzaninotto/Fakerquote:Op maandag 12 januari 2015 11:44 schreef Aether het volgende:
Voor als iemand testgegevens nodig heeft:
http://www.generatedata.com/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE TABLE IF NOT EXISTS `videos` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `site_id` int(10) unsigned NOT NULL, `video_id` varchar(64) NOT NULL, `tags` varchar(255) NOT NULL, `uploaddate` datetime NOT NULL, `title` varchar(255) NOT NULL, `description` text NOT NULL, `thumbnail` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, `embed` varchar(255) NOT NULL, `seconds` int(10) unsigned NOT NULL, `lastview` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `ratingcount` int(10) unsigned NOT NULL, `ratingtotal` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `site_id` (`site_id`), FULLTEXT KEY `tags` (`tags`), FULLTEXT KEY `title` (`title`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7217117 ; |
1 2 | SELECT COUNT( 1 ) FROM (SELECT * FROM `videos` WHERE `tags` LIKE '%home%') t |
Ik heb zelf slechte ervaringen met zoeken in grote tabellen, zowel MyISAM als InnoDB.quote:Op donderdag 15 januari 2015 10:14 schreef Chandler het volgende:
Korte vraag mbt zoeken op grote tabellen.
Voor een vriend mag ik een importeer scriptje schrijven voor het importeren van ruim 7 miljoen videos met oa de volgende gegevens titel, tags, duur
Nu heb ik al een scriptje geschreven die dit alles importeert in een database tabel waarbij ik titel, tags als fulltext indexeer en wil apart daarvan de duur (lengte van het filmpje) ook nog gaan indexeren (zodat de gebruiker daar ook op kan zoeken)
Nu heb ik net een query uitgevoerd op deze tabel en dat duurde echt erg lang
Tabel: 7,217,116 MyISAM latin1_swedish_ci 4,8 GiB
[ code verwijderd ]
Nu duurt de volgende query:
[ code verwijderd ]
erg lang (zo'n 10 seconden).
Met limit 0,30 duurt deze query 0.0240 secs
Is er een mogelijkheid om deze query sneller te maken? eventueel tags in een apart tabel?
quote:Op donderdag 15 januari 2015 13:17 schreef Monolith het volgende:
Zoals echter al aangegeven kun je beter een search platform gebruiken als SOLR, ElasticSearch, Sphinx, etcetera.
Je kunt het iets beter krijgen door geen subquery te gebruiken:quote:Op donderdag 15 januari 2015 10:14 schreef Chandler het volgende:
Nu duurt de volgende query:
[ code verwijderd ]
erg lang (zo'n 10 seconden).
Met limit 0,30 duurt deze query 0.0240 secs
Is er een mogelijkheid om deze query sneller te maken? eventueel tags in een apart tabel?
1 | SELECT COUNT( * ) FROM `videos` WHERE `tags` LIKE '%home%' |
Da's zeker een optie die het overwegen waard is, helemaal omdat het over redelijk grote datasets gaat.quote:Op donderdag 15 januari 2015 13:17 schreef Monolith het volgende:
Zoals echter al aangegeven kun je beter een search platform gebruiken als SOLR, ElasticSearch, Sphinx, etcetera.
Die tags in een aparte tabel opslaan is alvast een stap, mits je de indexes goed zet en gebruikt.quote:Op vrijdag 16 januari 2015 08:05 schreef Chandler het volgende:
Klopt Light!
Echter heeft de hosting waar dit straks moet gaan draaien blijkbaar geen zoekplatformen of de mogelijkheid daarvoor, ik ga eerst eens spelen met tags en kijken hoe ik daar het meeste uit kan halen. Eventueel het tijdelijk opslaan van data sets... zodat hergebruik stukken sneller gaat...
Query:quote:MySQL gaf een lege resultatenset terug (0 rijen). (query duurde 157.0733 sec)
1 2 3 4 5 6 7 | SELECT b . * FROM video_tag_link bt, videos b, tags t WHERE bt.tag_id = t.tag_id AND (t.name IN ('home', 'video')) AND b.id = bt.video_id GROUP BY b.id HAVING COUNT( b.id ) =2 |
Dat kan sneller toch?quote:Showing rows 0 - 29 (213 total, query duurde 51.7825 sec)
Voer de query eens uit met EXPLAIN aan het begin.quote:Op maandag 19 januari 2015 12:08 schreef Chandler het volgende:
ff een queries gespeeld, is niet gemakkelijk zeg(zonder specifieke zoekplatformen, maar moet toch echt wel sneller kunnen).
Showing rows 0 - 29 (213 total, query duurde 51.7825 sec)
Dat kan sneller toch?
quote:Op maandag 19 januari 2015 12:21 schreef Aether het volgende:
[..]
Voer de query eens uit met EXPLAIN aan het begin.
Dan kun je zien waar het beste indices geplaatst kunnen worden.
1 2 3 | 1 SIMPLE t range PRIMARY,name,id name 34 NULL 2 Using index condition; Using temporary; using filesort 1 SIMPLE b ALL PRIMARY NULL NULL NULL 7158720 Using join buffer (Block Nested Loop) 1 SIMPLE bt eq_ref video_id video_id 8 a.b.id,a.t.tag_id 1 Using index |
Ik zal het eens bekijken en uitproberenquote:Op maandag 19 januari 2015 13:13 schreef Monolith het volgende:
Het ziet er in ieder geval uit als een hele kromme query. Gebruik je nou IN en HAVING om enerzijds te selecteren op twee tag names en anderzijds te checken of ze allebei gevonden worden? In dat geval zou ik eens kijken of je middels WHERE EXISTS niet sneller resultaat krijgt.
Bij dezequote:Verder valt er vrij weinig te zeggen over je query zonder de onderliggende db structuur te kennen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | CREATE TABLE IF NOT EXISTS `tags` ( `tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, PRIMARY KEY (`tag_id`), UNIQUE KEY `name` (`name`), KEY `id` (`tag_id`,`name`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=200938 ; CREATE TABLE IF NOT EXISTS `videos` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `tags` varchar(255) NOT NULL, -- tijdelijk voor andere tests (zelfde inhoud als beide andere tabellen) `title` varchar(255) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `tags` (`tags`), FULLTEXT KEY `title` (`title`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7158721 ; CREATE TABLE IF NOT EXISTS `video_tag_link` ( `video_id` int(10) unsigned NOT NULL, `tag_id` int(10) unsigned NOT NULL, UNIQUE KEY `video_id` (`video_id`,`tag_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- 48miljoen records |
Je mist een index in je koppeltabelquote:Op maandag 19 januari 2015 17:09 schreef Chandler het volgende:
[..]
Ik zal het eens bekijken en uitproberen
[..]
Bij deze
[ code verwijderd ]
1 | ALTER TABLE `video_tag_links` ADD INDEX `tag_id` (`tag_id`); |
Er wordt een full table scan gedaan bij een query waar je dat niet verwacht, dus de indices staan niet goed. Dat die full table scan op de video's-tabel wordt gedaan en niet op de koppeltabel, komt omdat die laatste tabel veel groter is (7mln vs 48 mln rijen).quote:Op maandag 19 januari 2015 19:41 schreef Monolith het volgende:
Volgens mij doet hij altijd een query op beide velden in de index, dus zou dat op zich goed moeten gaan. Hoewel het lang geleden is dat ik me in detail met indices in MySQL heb beziggehouden.
Ah, ik had de explain even gemist.quote:Op maandag 19 januari 2015 19:49 schreef Light het volgende:
[..]
Er wordt een full table scan gedaan bij een query waar je dat niet verwacht, dus de indices staan niet goed. Dat die full table scan op de video's-tabel wordt gedaan en niet op de koppeltabel, komt omdat die laatste tabel veel groter is (7mln vs 48 mln rijen).
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |