⚈ Kuopassa.net

Lisää kertomuksia netistä. 摆烂

Kuinka parantaa MySQL-kantaan menevää kyselyä (aivopähkinä)

Löysin Stackoverflow’sta vuosien ikäisen MySQL-tietokantaan tehtävän kyselyn. Sen julkaissut henkilö vihjasi haluavansa nopeuttaa sitä kyselyä niin, että noin 4000 riviä sisältävästä tietokannasta datan rouskuttaminen sujuisi nopeammin. Hän kirjoitti ensimmäisen kyselykerran vievän 5–10 sekuntia, ja sitä seuraavien sujuvan paljon nopeammin. Haluan katsoa miltä se kysely näyttäisi jos minä kirjoittaisin sen, vaikka nyt aamuneljältä.

Alkuperäinen kysely

SELECT PRODUCT_2_CATEGORY.PRODUCT_ID FROM PRODUCT_2_CATEGORY, PRODUCT, MERCHANT WHERE PRODUCT_2_CATEGORY.PRODUCT_ID = PRODUCT.ID AND PRODUCT.PRO_STATUS='active' AND PRODUCT.MERCHANT_ID = MERCHANT.ID AND MERCHANT.M_STATUS='active' AND ( CAT_ID='1' OR CAT_ID='1004' OR CAT_ID='1005' OR CAT_ID='1006' OR CAT_ID='1007' OR CAT_ID='1008' OR CAT_ID='1002' OR CAT_ID='1003' OR CAT_ID='45' OR CAT_ID='46' OR CAT_ID='74' OR CAT_ID='75' OR CAT_ID='76' OR CAT_ID='49' OR CAT_ID='50' OR CAT_ID='77' OR CAT_ID='78' OR CAT_ID='79' OR CAT_ID='80' OR CAT_ID='81' OR CAT_ID='82' OR CAT_ID='83' OR CAT_ID='84' OR CAT_ID='47' OR CAT_ID='89' OR CAT_ID='51' OR CAT_ID='52' OR CAT_ID='88' OR CAT_ID='87' OR CAT_ID='86' OR CAT_ID='85' OR CAT_ID='48' OR CAT_ID='53' OR CAT_ID='54' OR CAT_ID='90' OR CAT_ID='200' OR CAT_ID='91' OR CAT_ID='92' OR CAT_ID='93' OR CAT_ID='94' OR CAT_ID='11' OR CAT_ID='95' OR CAT_ID='98' OR CAT_ID='99' OR CAT_ID='100' OR CAT_ID='101' OR CAT_ID='96' OR CAT_ID='102' OR CAT_ID='103' OR CAT_ID='104' OR CAT_ID='105' OR CAT_ID='106' OR CAT_ID='97' OR CAT_ID='107' OR CAT_ID='108' OR CAT_ID='109' OR CAT_ID='110' OR CAT_ID='114' OR CAT_ID='119' OR CAT_ID='120' OR CAT_ID='121' OR CAT_ID='115' OR CAT_ID='122' OR CAT_ID='123' OR CAT_ID='124' OR CAT_ID='125' OR CAT_ID='116' OR CAT_ID='127' OR CAT_ID='128' OR CAT_ID='129' OR CAT_ID='117' OR CAT_ID='130' OR CAT_ID='131' OR CAT_ID='118' OR CAT_ID='111' OR CAT_ID='132' OR CAT_ID='136' OR CAT_ID='137' OR CAT_ID='138' OR CAT_ID='139' OR CAT_ID='140' OR CAT_ID='133' OR CAT_ID='141' OR CAT_ID='142' OR CAT_ID='143' OR CAT_ID='144' OR CAT_ID='145' OR CAT_ID='146' OR CAT_ID='134' OR CAT_ID='147' OR CAT_ID='148' OR CAT_ID='149' OR CAT_ID='150' OR CAT_ID='151' OR CAT_ID='135' OR CAT_ID='152' OR CAT_ID='153' OR CAT_ID='154' OR CAT_ID='155' OR CAT_ID='156' OR CAT_ID='64' OR CAT_ID='158' OR CAT_ID='70' OR CAT_ID='164' OR CAT_ID='71' OR CAT_ID='165' OR CAT_ID='159' OR CAT_ID='166' OR CAT_ID='167' OR CAT_ID='168' OR CAT_ID='169' OR CAT_ID='160' OR CAT_ID='73' OR CAT_ID='170' OR CAT_ID='172' OR CAT_ID='173' OR CAT_ID='174' OR CAT_ID='161' OR CAT_ID='175' OR CAT_ID='176' OR CAT_ID='177' OR CAT_ID='178' OR CAT_ID='162' OR CAT_ID='179' OR CAT_ID='180' OR CAT_ID='181' OR CAT_ID='182' OR CAT_ID='183' OR CAT_ID='163' OR CAT_ID='184' OR CAT_ID='192' OR CAT_ID='191' OR CAT_ID='190' OR CAT_ID='189' OR CAT_ID='188' OR CAT_ID='187' OR CAT_ID='186' OR CAT_ID='185' OR CAT_ID='193' OR CAT_ID='112' OR CAT_ID='113' OR CAT_ID='65' OR CAT_ID='66' OR CAT_ID='67' OR CAT_ID='68' OR CAT_ID='69') AND MATCH(PRODUCT.TITLE) AGAINST('shirt' IN BOOLEAN MODE) ORDER BY PRODUCT.TITLE ASC LIMIT 0, 12


Poistin lainausmerkit tuotekategorioiden numeroista ja laitoin ne IN-komentoon. No joo, ehkä tuossa on vielä muutakin parannettavaa. Jos keksit ideoita, kirjoita mailia osoitteeseen pete@kuopassa.com ja laitan ne jutun jatkoksi.

Parannettu kysely

SELECT
PRODUCT_2_CATEGORY.PRODUCT ID
FROM
`PRODUCT_2_CATEGORY`,
`PRODUCT`,
`MERCHANT`
WHERE
PRODUCT_2_CATEGORY.PRODUCT_ID = PRODUCT.ID
AND
PRODUCT.PRO_STATUS = 'active'
AND
PRODUCT.MERCHANT_ID = MERCHANT.ID
AND
MERCHANT.M_STATUS = 'active'
AND
PRODUCT.CAT_ID IN
(1,100,1002,1003,1004,1005,1006,1007,1008,101,102,103,104,105,106,107,108,109,11,110,111,112,
113,114,115,116,117,118,119,120,121,122,123,124,125,
127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,
153,154,155,156,158,159,160,161,162,
163,164,165,166,167,168,169,170,172,173,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
191,192,193,200,45,46,47,48,49,50,51,
52,53,54,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99)
AND
MATCH(PRODUCT.TITLE) AGAINST('shirt' IN BOOLEAN MODE)
ORDER BY
PRODUCT.TITLE ASC
LIMIT 0, 12

Tietoa kirjoittajasta