Ik heb een InnoDB Table gemaakt in MySQL welke op een server draait. Binnen deze tabel heb ik verschillende kolommen waarvan 1 kolom een zogenaamde "last_sync" kolom is. Als een record wordt toegevoegd is last_sync gelijk aan het mysql commando "CURRENT_TIMESTAMP".
Afin, mijn client software wil dus een zoek query doen op last_sync om te kijken of alles wat hij heeft gesynchronizeerd is. Mijn query hiervoor is de volgende.
Zoals je ziet een vrij normale query waarbij opgemerkt moet worden dat de limit ingevuld wordt door de client. Dit gebeurt in stapjes van 5000 dus:
De tabel heeft ongeveer 300,000 records welk allemaal praktisch tegelijkertijd ingevuld zijn. De query bovenaan zal dus alle 300,000 records doorgeven. Het is logisch om een index op de last_sync te plaatsen, daar ik een where heb die alleen op last_sync filtered.
Een explain ziet er als volgt uit:
Wat is nu mijn probleem? Als mijn server de opgehaalde records streamt naar de client dan loopt de tijd die de query nodig heeft op. Het begint bij 120ms (limit 0, 5000) en eindigt bij 900 ms(limit 260000,5000). Waarom is dit zo?
Ten tweede, wanneer ik precies dezelfde query toepas en de index verwijder (!) dan begint hij op 30 ms en eindigt bij 500 ms. Waarom is de query zonder index op de table sneller?
Overigens, ik gebruik de limit omdat ik de resultset niet te groot wil hebben. Wanneer meerdere gebruikers met de client 300,000 records op halen (waarbij 300,000 zeker niet het maximale is) kan de server plat gaan. Hierom gebruik ik een limit. Ik nam echter onterrecht aan dat een limit gebruiken in een query het minder intensief maakt voor MySQL aangezien de query zonder limit evenveel tijd nodig heeft.
Samengevat mijn vragen
1) Waarom neemt de query executie tijd toe naarmate de limit op een verder punt in de resultset begint?
2) Waarom is mijn query in dit geval zonder index sneller?
3) Welke mogelijkheden heb ik op de snelheid te verbeteren en een kortere query executie tijd af te dwingen? De index heeft kennelijk gefaald...
Alvast bedankt!
Afin, mijn client software wil dus een zoek query doen op last_sync om te kijken of alles wat hij heeft gesynchronizeerd is. Mijn query hiervoor is de volgende.
code:
1
| SELECT * from city where last_sync > '1900-01-01 00:00:00' AND last_sync < 2009-01-22 00:00:00' limit [aangevuld door app],[aangevuld door app]; |
Zoals je ziet een vrij normale query waarbij opgemerkt moet worden dat de limit ingevuld wordt door de client. Dit gebeurt in stapjes van 5000 dus:
code:
1
2
3
| limit 0, 5000 limit 5000,5000 limit 10000,5000 |
De tabel heeft ongeveer 300,000 records welk allemaal praktisch tegelijkertijd ingevuld zijn. De query bovenaan zal dus alle 300,000 records doorgeven. Het is logisch om een index op de last_sync te plaatsen, daar ik een where heb die alleen op last_sync filtered.
Een explain ziet er als volgt uit:
code:
1
2
3
4
5
| +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ | 1 | SIMPLE | city | range | sync_dates | sync_dates | 8 | NULL | 138456 | Using where | +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ |
Wat is nu mijn probleem? Als mijn server de opgehaalde records streamt naar de client dan loopt de tijd die de query nodig heeft op. Het begint bij 120ms (limit 0, 5000) en eindigt bij 900 ms(limit 260000,5000). Waarom is dit zo?
Ten tweede, wanneer ik precies dezelfde query toepas en de index verwijder (!) dan begint hij op 30 ms en eindigt bij 500 ms. Waarom is de query zonder index op de table sneller?
Overigens, ik gebruik de limit omdat ik de resultset niet te groot wil hebben. Wanneer meerdere gebruikers met de client 300,000 records op halen (waarbij 300,000 zeker niet het maximale is) kan de server plat gaan. Hierom gebruik ik een limit. Ik nam echter onterrecht aan dat een limit gebruiken in een query het minder intensief maakt voor MySQL aangezien de query zonder limit evenveel tijd nodig heeft.
Samengevat mijn vragen
1) Waarom neemt de query executie tijd toe naarmate de limit op een verder punt in de resultset begint?
2) Waarom is mijn query in dit geval zonder index sneller?
3) Welke mogelijkheden heb ik op de snelheid te verbeteren en een kortere query executie tijd af te dwingen? De index heeft kennelijk gefaald...
Alvast bedankt!