Ik heb hier aardig wat mee getest en dit heb ik nog nooit gezien. Heb je een dataset, een query, en een MySQL-versienummer waarbij dit optreedt?quote:Op dinsdag 20 september 2011 11:36 schreef Intrepidity het volgende:
[..]
Klopt, maar toch pakt hij een eventuele index niet mee tenzij je expliciet een kolom met index specificeert. MySQL is een hacky stuk code. Zolang je gewoon de PK in een COUNT gebruikt is er niets aan het handje
1 2 3 4 5 6 7 8 | CREATE TABLE `comments` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `content_id` timestamp NULL DEFAULT NULL, -- timestamp ja :D *snip* hoop blabla *snip* `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `by_content_id` (`content_id`,`created_at`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
1 2 3 4 5 6 7 8 9 10 11 | SELECT COUNT(*) FROM ( SELECT 1 FROM comments GROUP BY content_id HAVING MAX(created_at) > ( SELECT MAX(created_at) FROM comments WHERE content_id = FROM_UNIXTIME(1316465786) ) ) AS predecessors |
Ik heb nu geen tijd (@ werk), maar zal vanavond eens wat gaan testenquote:Op dinsdag 20 september 2011 11:56 schreef GlowMouse het volgende:
[..]
Ik heb hier aardig wat mee getest en dit heb ik nog nooit gezien. Heb je een dataset, een query, en een MySQL-versienummer waarbij dit optreedt?
quote:Op dinsdag 20 september 2011 11:57 schreef Thomass het volgende:
GlowMouse, hoe ben jij ooit zon MySQL-baas geworden als ik mag vragen?
1 2 3 4 5 6 7 | SELECT COUNT(DISTINCT content_id) FROM comments WHERE created_at > ( SELECT MAX(created_at) FROM comments WHERE content_id = FROM_UNIXTIME(1316465786) ) |
1 2 3 4 | SELECT COUNT(DISTINCT c1.content_id) FROM comments c1 LEFT JOIN c2 ON(c1.content_id=c2.content_id AND c2.created_at>[subquery eerst uitvoeren en het resultaat hier zetten]) WHERE c2.content_id IS NULL |
Deel 3 komt eraan: http://www.xaprb.com/blog(...)mysql-third-edition/quote:Op dinsdag 20 september 2011 12:04 schreef GlowMouse het volgende:
[..]
http://shop.oreilly.com/product/9780596101718.do en http://www.mysqlperformanceblog.com/ helemaal lezen, en veel uitproberen. De meeste kennis heb ik in een maandje of 2-3 wel verworven.
Binnen je applicatie heb je er niet zo veel aan afaik. Je gebruikt het direct op MySQL om je queries te optimaliseren voordat je ze in je applicatie gaat gebruiken.quote:Op dinsdag 20 september 2011 12:51 schreef Sitethief het volgende:
Is EXPLAIN ook goed in te zetten als je een PDO class hebt opgebouwd waarmee je al je queries afhandelt?
Het is verwarrend ja maar ik bedoelde wel een groter dan. Item met meest recent comment heeft 0 predecessors, t item met het op-ena-meest recente comment heeft 1 predecessor enz.quote:Op dinsdag 20 september 2011 12:14 schreef GlowMouse het volgende:
Volgens mij bedoel je op regel 6 een < ipv een >. Voor een < kun je zoiets doen:
[ code verwijderd ]
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 | mysql> show create table comments2\G *************************** 1. row *************************** Table: comments2 Create Table: CREATE TABLE `comments2` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `content_id` int(10) unsigned DEFAULT NULL, `created_at` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `by_content_id` (`content_id`,`created_at`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> select count(*) from comments2; +----------+ | count(*) | +----------+ | 2359296 | +----------+ 1 row in set (0.02 sec) mysql> select content_id, max(created_at) from comments2 group by content_id order by max(created_at) asc; +------------+-----------------+ | content_id | max(created_at) | +------------+-----------------+ | 1 | 3 | | 2 | 6 | *snip* | 2654208 | 5308416 | | 3981312 | 7962624 | +------------+-----------------+ 95 rows in set (0.04 sec) |
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 | mysql> SELECT COUNT(DISTINCT content_id) -> FROM comments2 -> WHERE created_at > ( -> SELECT MAX(created_at) -> FROM comments2 -> WHERE content_id = 2654208 -> ); +----------------------------+ | COUNT(DISTINCT content_id) | +----------------------------+ | 1 | +----------------------------+ 1 row in set (1.58 sec) mysql> SELECT COUNT(*) -> FROM ( -> SELECT 1 -> FROM comments2 -> GROUP BY content_id -> HAVING MAX(created_at) > ( -> SELECT MAX(created_at) -> FROM comments2 -> WHERE content_id = 2654208 -> ) -> ) AS predecessors; +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.01 sec) |
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 | mysql> explain SELECT COUNT(*) -> FROM ( -> SELECT 1 -> FROM comments2 -> GROUP BY content_id -> HAVING MAX(created_at) > ( -> SELECT MAX(created_at) -> FROM comments2 -> WHERE content_id = 2654208 -> ) -> ) AS predecessors; +----+-------------+-----------+-------+---------------+---------------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+-------+---------------+---------------+---------+------+------+------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | | 2 | DERIVED | comments2 | range | NULL | by_content_id | 5 | NULL | 95 | Using index for group-by | | 3 | SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-----------+-------+---------------+---------------+---------+------+------+------------------------------+ 3 rows in set (0.01 sec) mysql> explain SELECT COUNT(DISTINCT content_id) -> FROM comments2 -> WHERE created_at > ( -> SELECT MAX(created_at) -> FROM comments2 -> WHERE content_id = 2654208 -> ); +----+-------------+-----------+-------+---------------+---------------+---------+------+---------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+-------+---------------+---------------+---------+------+---------+------------------------------+ | 1 | PRIMARY | comments2 | index | NULL | by_content_id | 9 | NULL | 2359296 | Using where; Using index | | 2 | SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-----------+-------+---------------+---------------+---------+------+---------+------------------------------+ 2 rows in set (0.00 sec) |
quote:Op dinsdag 20 september 2011 12:51 schreef Sitethief het volgende:
Is EXPLAIN ook goed in te zetten als je een PDO class hebt opgebouwd waarmee je al je queries afhandelt?
Dat hangt er maar net vanaf. Wij werken hier bv aan een behoorlijk grote (web)applicatie met enkele duizenden query's waarvan ook een flink deel automatisch gegenereerd is. We hebben pagina's met meer dan 100 query's en dan is het nogal fijn als je niet alles met de hand hoeft na te lopen. We hebben daarom op de devservers gewoon een analyser meelopen die voor iedere query ook een explain uitvoert en deze analyseert. Als het systeem denkt dat het beter kan zet hij netjes een warnings icoontje bij onze query log die onder iedere pagina staat met de values, tijd etc. Klik je er op krijg je de explain, backtraces en nog veel meer debug informatiequote:Op dinsdag 20 september 2011 13:00 schreef Intrepidity het volgende:
[..]
Binnen je applicatie heb je er niet zo veel aan afaik. Je gebruikt het direct op MySQL om je queries te optimaliseren voordat je ze in je applicatie gaat gebruiken.
HandlerSocketquote:
Hmm een automatische tool die een samenvatting op iedere pagina zet vs een losse tool die je handmatig moet draaien, eerst een netwerk dump maken en dan analyseren. Ik weet het wel De nuttige informatie die er uit komt is vrijwel hetzelfde.quote:Op woensdag 21 september 2011 17:40 schreef GlowMouse het volgende:
Dit werkt veel lekkerder:
http://www.mysqlperforman(...)maatkit-and-tcpdump/
Je klinkt imo als een random persoon die gewoon de laatste hype na blaat.quote:
1 | SELECT * FROM `producten` WHERE `prijs` = 15 OR `prijs` = 25; |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |