Trage query op MariaDB maar niet op MySQL

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Ik heb 2 losstaande VPS'en die redelijk gelijke omstandigheden draaien (zelfde OS, zelfde CPU, memory etc..). Op de ene draait MariaDB 10.0.30, op de andere draait MySQL 5.5.47 . Nu gaan beide omgevingen totaal anders om met een redelijk simpele query met het resultaat dat de query op MariaDB er 9 seconden over doet en op MySQL nog geen 0.05 seconde.

Dit is de query:
code:
1
2
3
4
5
6
7
8
9
SELECT cb.*, COUNT(DISTINCT sp.product_id) as 'num_products', MIN(sp.price) AS 'min_price'
FROM shop_product_category spc
INNER JOIN shop_product sp ON sp.product_id = spc.product_id
INNER JOIN shop_product_car spca ON spca.product_id = sp.product_id
INNER JOIN cars_model cm ON cm.model_id = spca.model_id
INNER JOIN cars_brand cb ON cb.brand_id = cm.brand_id
WHERE spc.category_id='241' AND cb.active AND sp.active AND !sp.deleted AND !cm.deleted
GROUP BY cb.brand_id
ORDER BY cb.name ASC


Resultaat EXPLAIN op MySQL:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEspcrefPRIMARY,category_id,product_idPRIMARY4const6272Using index; Using temporary; Using filesort
1SIMPLEspeq_refPRIMARYPRIMARY4hottnl_2016_dev.spc.product_id1Using where
1SIMPLEspcarefproduct_id_brand_id_model_id_type_id,product_id_type_id,product_id,model_idproduct_id5hottnl_2016_dev.sp.product_id2Using where
1SIMPLEcmeq_refPRIMARY,brand_id,model_id_active_deleted,brand_id_active_deletedPRIMARY4hottnl_2016_dev.spca.model_id1Using where
1SIMPLEcbeq_refPRIMARYPRIMARY4hottnl_2016_dev.cm.brand_id1Using where



Resultaat EXPLAIN op MariaDB:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEspcaindexproduct_id_brand_id_model_id_type_id,product_id_type_idproduct_id_brand_id_model_id_type_id202349372Using where; Using index; Using temporary; Using filesort
1SIMPLEcmeq_refPRIMARY,brand_id,model_id_active_deleted,brand_id_active_deletedPRIMARY4hottnl_2016.spca.model_id1Using where
1SIMPLEspceq_refPRIMARY,category_id,product_idPRIMARY8const,hottnl_2016.spca.product_id1Using index
1SIMPLEspeq_refPRIMARY,active_deleted,deleted,deleted_e_timestampPRIMARY4hottnl_2016.spca.product_id1Using where
1SIMPLEcbeq_refPRIMARYPRIMARY4hottnl_2016.cm.brand_id1Using where



Ze geven beide een totaal ander resultaat. Mijn vraag is nu; ligt dit puur aan een andere omgeving: mariadb vs mysql? Dat lijkt mij namelijk niet... Of moet ik het eerder zoeken in de variabelen van MariaDB, en zo ja naar welke waardes moet ik dan kijken?

Als het nodig is om de structuur van de tabellen hier te posten hoor ik het wel, volgens mij is het niet nodig omdat het niet een query specifieke vraag is. Er zijn meerdere queries waarbij een groot verschil is tussen beide omgevingen. Maar het is niet zo dat MariaDB het voor alles verprutst. Sterker nog; op de MariaDB server draaien een aantal website helemaal vlekkeloos.

PS. Uiteraard zijn de tabellen op beide databases identiek gevuld, met dezelfde keys etc...

Beste antwoord (via RickyHeijnen op 04-10-2017 15:23)


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Vergeet dat met ssd/hdd, daar moet je pas naar kijken als de execution plans hetzelfde zijn. Draai ANALYZE TABLE eens op alle tabellen en kijk of de execution plans dan wel overeenkomen. Je kunt altijd nog STRAIGHT_JOIN gebruiken om een execution plan af te dwingen. Als je de query echt snel wilt hebben, zorg dan dat cb de eerste tabel is (in het execution plan, niet noodzakelijkerwijs in de query), vervang GROUP BY cb.brand_id door GROUP BY cb.name,cb.brand_id, en zet één index op de twee velden cb.name,cb_brand_id.

[ Voor 6% gewijzigd door GlowMouse op 15-05-2017 16:42 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • Aegean
  • Registratie: Juni 2012
  • Niet online
Kan het zijn dat de ene VPS een SSD heeft en de ander een HDD?

Je kunt dit eenvoudig testen:
code:
1
dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/outputp


https://askubuntu.com/que...eck-hard-disk-performance

Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

Aegean schreef op maandag 15 mei 2017 @ 16:31:
Kan het zijn dat de ene VPS een SSD heeft en de ander een HDD?

Je kunt dit eenvoudig testen:
code:
1
dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/outputp


https://askubuntu.com/que...eck-hard-disk-performance
Moet je er hierbij wel even zeker weten dat /tmp geen tmpfs is (in werkgeheugen dus), maar daadwerkelijk een filesystem op de schijf. :)

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Zou dat het verschil kunnen zijn? Heb het even gecheckt voor de zekerheid en zie daar inderdaad een groot verschil.

MariaDB VPS
code:
1
2
3
4
root@cloud01 [~]# dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/out                                                           putp
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0.208914 s, 402 MB/s


MySQL VPS
code:
1
2
3
4
[root@mysql ~]# dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/outputp
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0.0826691 s, 1.0 GB/s


Ik ga eens contact opnemen met de de hostingprovider om wat uitleg te vragen hierover. Als dat de oplossing is: Bedankt voor de tip _/-\o_

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Vergeet dat met ssd/hdd, daar moet je pas naar kijken als de execution plans hetzelfde zijn. Draai ANALYZE TABLE eens op alle tabellen en kijk of de execution plans dan wel overeenkomen. Je kunt altijd nog STRAIGHT_JOIN gebruiken om een execution plan af te dwingen. Als je de query echt snel wilt hebben, zorg dan dat cb de eerste tabel is (in het execution plan, niet noodzakelijkerwijs in de query), vervang GROUP BY cb.brand_id door GROUP BY cb.name,cb.brand_id, en zet één index op de twee velden cb.name,cb_brand_id.

[ Voor 6% gewijzigd door GlowMouse op 15-05-2017 16:42 ]


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Probeer anders eens delen van de query volgorde te forceren
https://mariadb.com/kb/en...how-to-force-query-plans/

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:27

Standeman

Prutser 1e klasse

MySQL rows: 6272 vs MariaDB rows : 2349372

MariaDB processed bijna 374.6 keer zoveel rows als MySQL. Kan het niet zijn dat je ergens een index mist o.i.d.? (Ik ben verder geen DBA of zo :p)

[ Voor 8% gewijzigd door Standeman op 15-05-2017 16:46 ]

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Standeman schreef op maandag 15 mei 2017 @ 16:44:
MySQL rows: 6272 vs MariaDB rows : 2349372

MariaDB processed bijna 374.6 keer zoveel rows als MySQL. Kan het niet zijn dat je ergens een index mist o.i.d.? (Ik ben verder geen DBA of zo)
Nee indexes zijn echt exact hetzelfde.
GlowMouse schreef op maandag 15 mei 2017 @ 16:42:
Draai ANALYZE TABLE eens op alle tabellen en kijk of de execution plans dan wel overeenkomen.
Done that, en je hebt gelijk. De execution plans zijn nu wel exact hetzelfde. Query snelheid is nu terug gebracht van 8 sec. naar 1.2 sec op MariaDB vs 0.05 op MySQL. Zou dat verschil dan wel te verklaren zijn door HDD/SSD ?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Ik vermoed dat het grote verschil door de processorsnelheid komt, en wellicht door de hoeveelheid van de tabel die daadwerkelijk in het fysieke ramgeheugen zit. Storage is immers maar een factor 2.5 trager. Met de suggestie die ik deed, kun je hem nog wel fors sneller krijgen; het enkel toevoegen van de index en aanpassen van GROUP BY is daarvoor waarschijnlijk al voldoende.

[ Voor 34% gewijzigd door GlowMouse op 15-05-2017 16:53 ]


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
GlowMouse schreef op maandag 15 mei 2017 @ 16:51:
Met de suggestie die ik deed, kun je hem nog wel fors sneller krijgen; het enkel toevoegen van de index en aanpassen van GROUP BY is daarvoor waarschijnlijk al voldoende.
Toch niet... met het toevoegen van de index en GROUP BY blijft hij toch de brand_id key pakken op de cb tabel. Hij neem dus niet de key van die 2 kolommen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dan moet je met STRAIGHT_JOIN zorgen dat cb de eerste tabel is in het execution plan. Een nadeel dan is wel dat de query wat langer duurt bij zeldzame categorieën dan bij veelvoorkomende categorieën.

[ Voor 9% gewijzigd door GlowMouse op 15-05-2017 17:48 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Van de tabel spc wordt in beide gevallen de PK gebruikt, maar key_len is 4 vs 8. Weet je zeker dat de structuur hetzelfde is? Kan bijna niet zo zijn. :P

{signature}


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Voutloos schreef op maandag 15 mei 2017 @ 20:36:
Van de tabel spc wordt in beide gevallen de PK gebruikt, maar key_len is 4 vs 8. Weet je zeker dat de structuur hetzelfde is? Kan bijna niet zo zijn. :P
Key_len is alleen het gebruikte deel van de index. In het eerste geval wordt in de index niet naar product_id gezocht (al wordt de waarde wel uit de index uitgelezen, zo blijkt uit using index)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Vooruit, alhoewel het geen kwaad had gekund om te zeggen dat deze PK op beide omgevingen dus (category_id, product_id) is.
(En de losse index op category_id zou daarmee redundant zijn).

{signature}


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Oke, dat ga ik dan straks nog wel even proberen. Maargoed, afgezien daarvan hebben beide servers nu wel dezelfde execution plan, maar toch nog een groot verschil in execution time. 1.2 sec vs 0.05 sec. Hoe kom ik er nu achter waar dat grote verschil in zit? Kan me niet voorstellen dat het alleen HDD/SSD is.

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
RickyHeijnen schreef op dinsdag 16 mei 2017 @ 10:21:
Hoe kom ik er nu achter waar dat grote verschil in zit? Kan me niet voorstellen dat het alleen HDD/SSD is.
Zorg er eerst even voor dat de volgende meldingen er niet zijn:
code:
1
2
3
Using temporary
Using filesort
Using where

En kijk dan of er nog verschillen zijn

[ Voor 5% gewijzigd door DJMaze op 16-05-2017 13:14 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Tazzios
  • Registratie: November 2001
  • Laatst online: 17:22

Tazzios

..

Zijn de tabellen misschien in verschillend formaten opgeslagen? (innodb, aria, mysam etc)

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@RickyHeijnen Draai hem ook even zonder cache.

Acties:
  • 0 Henk 'm!

  • mr_derk
  • Registratie: September 2005
  • Laatst online: 20:13
Even over die group by..

In Oracle is dit in ieder geval ongeldig. De kolommen zonder aggregatie (min,max,avg,sum,count) in je select moeten ook terugkomen in de group by clausule.

Blijkbaar is het in jouw voorbeelden wel legaal, kan het zijn dat één van beide er toch niet zo goed mee om kan zijn?
Pagina: 1