Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2003

Snabba upp MySQL query?

Är inte så vass på MySQL ännu och nu har jag ett lite större shop projekt där det ligger väldigt många produkter. Går det att skiva denna queryn på något annat bättre sätt för att snabba upp den lite? Eller kanske ändra index osv i databasen?

Query:
SELECT P.* FROM shop_products AS P WHERE C.id IN (SELECT categories_id FROM shop_products_to_categories WHERE products_id = P.id AND (categories_id='$id' OR parent='$id'))

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2004

Har du provat att använda en join istället för en subquery för att se ifall det blir bättre prestanda?

Trädvy Permalänk
Medlem
Registrerad
Jul 2001

Som hivemind säger, prova en join iställer.
Om jag förstått dig rätt vill du lista alla produkter i en kategori eller i en "parent".
Nått sånt här skulle nog fungera:

SELECT P.* FROM shop_products AS P JOIN shop_products_to_categories AS C ON (C.products_id = P.id) WHERE C.categories_id = $id OR parent= $id

Se till att ha index på shop_products.id, shop_products_to_categories.categories_id, shop_products_to_categories.products_id samt shop_products_to_categories.parent.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

Använd en view. Uppdatera den var tredje minut eller vad som nu är lämpligt.

Trädvy Permalänk
Medlem
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av azoapes
Använd en view. Uppdatera den var tredje minut eller vad som nu är lämpligt.

Går detta att göra i MySQL?
Jag har fått för mig att Views "uppdateras" så fort underliggande data ändras?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av Tjofras
Går detta att göra i MySQL?
Jag har fått för mig att Views "uppdateras" så fort underliggande data ändras?

Nej, det verkar inte gå att göra i MySQL... man får använda query cache istället: http://www.databasejournal.com/features/mysql/article.php/311...

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2003
Citat:

Ursprungligen inskrivet av Tjofras
Som hivemind säger, prova en join iställer.
Om jag förstått dig rätt vill du lista alla produkter i en kategori eller i en "parent".
Nått sånt här skulle nog fungera:

SELECT P.* FROM shop_products AS P JOIN shop_products_to_categories AS C ON (C.products_id = P.id) WHERE C.categories_id = $id OR parent= $id

Se till att ha index på shop_products.id, shop_products_to_categories.categories_id, shop_products_to_categories.products_id samt shop_products_to_categories.parent.

Grymt tack! Suttit ett tag och klurat men hur gör jag för att visa parent när variablen ligger i "shop_categories.parent" istället för i "shop_products_to_categories"?

Är en join alltid snabbare än en subquery? Googlade på det och fick väldigt blandade träffar.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av HotTuna.
Är en join alltid snabbare än en subquery? Googlade på det och fick väldigt blandade träffar.

Nej det är MySQL som har dålig prestanda bara i subquerys. MSSQL är t.ex. snabb i jämförelse.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004

I värsta fall får man förkalkulera en speciell söktabell.
Jag har ett projekt där jag har tre tabeller med några hundra miljoner rader i där det ska joinas i värsta fall ~hundra tusen rader från varje tabell.
Det var både min server och MySQL okababel till så jag fick skapa en "platt" tabell där allt redan var joinat OCH sorterat. Det görs med GNU-utilities sort & join i kommandoraden varpå resultatet sedan importeras i MySQL och sen ger subsekundsnabba resultat.
Att datan skulle vara försorterad är för att minska på hårddiskens läshuvudaktivitet. Och eftersom datan i söktabellen är read only går det att komprimera datafilen (myisamchk) vilket gör att mer data kan finnas i både operativsystemets och MySQLs cache.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av iXam
Jag har ett projekt där jag har tre tabeller med några hundra miljoner rader i där det ska joinas i värsta fall ~hundra tusen rader från varje tabell.

När jag läste T-SQL på högskolan tryckte vår lärare alltid på att använda AND i sin JOIN istället för WHERE, för att SQL-motorn då filtrerar bort det onödiga direkt och inte behöver joina allt i tabellen. Skulle vara intressant att höra om detta stämmer för MySQL (han var MSSQL-freak i första hand) ?