Pro-tip Vermijd SELECT *
of SELECT table.*
in prestatiegevoelige zoekopdrachten. Selecteer in plaats daarvan op naam de kolommen die u echt moet gebruiken
Pro-tip MySQL heeft een beruchte niet-standaard extensie voor GROUP BY
die u gebruikt en mogelijk misbruikt. Lees dit. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Als je de eerste professionele tip zou volgen, zou het volgen van de tweede veel gemakkelijker zijn.
Pro-tip Vermijd het "erin gooien" van veel indexen met één kolom in de hoop uw zoekopdrachten te versnellen. Maak in plaats daarvan indexen, vaak samengestelde indexen, die overeenkomen met de behoeften van uw daadwerkelijke zoekopdracht. Lees deze https://use-the-index-luke.com .
Pro-tip Using temporary; using filesort
verschijnen in EXPLAIN-uitvoer is niet per se slecht. Het betekent gewoon dat de query-engine een gedeeltelijke resultatenset in de cache moet opslaan voordat deze wordt geretourneerd. De temporary
ding is geen echte tabel, het is een RAM-structuur. Als het zo groot is dat het RAM overspoelt, zal MySQL het op schijf morsen. Maar de jouwe niet.
Dat gezegd hebbende, laten we uw zoekopdracht herformuleren. Ik neem aan dat je de rijen wilt ophalen met de grootste idCartDATA
waarde voor elke CartSplitData.SUPPLIERID
.
Laten we dat dus als een subquery schrijven.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Deze zoekopdracht kan drastisch worden versneld door een samengestelde index op CartSplitData te plaatsen:(SUPPLIERID, IDCartDATA)
.
Laten we vervolgens uw hoofdquery herschrijven om de rijen te vinden die overeenkomen met de ID's in die subquery.
SELECT CartData.* /* * hammers performance */
CartSplitData.* /* * hammers performance */
FROM CartData
JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
JOIN (
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
)x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
AND x.IDCartData = CartSplitData.IDCartData
WHERE CartData.CartOrderref = 'XXXXXXXXX'
Uw index op CartData.CartOrderref
zal deze buitenste query helpen, net als de samengestelde index die is gemaakt ^^^.