11. juni 2002 - 22:48Der er
24 kommentarer og 1 løsning
hjælp til optimering af tabel
Hej jeg har en prisliste med over 200.000 linier den er ret langsom og jeg er ret sikker på at det skyldes forkert opbygning af tabellen
id int(11) hosid int(11 nummer varchar(50) tal og bogstaver vis varchar(50 tal tegn og bogstaver beskrivelse varchar(200 tekst erstatning varchar(50 tal og bogstaver direkte decimal(10,2 brutto decimal(10,2 pak tinyint(4) tal
jeg søger i nummer,vis og beskrivelse nogen gode forslag!
($result = mysql_query("SELECT firmaliste.firmanavn ,priser.* FROM priser LEFT JOIN firmaliste ON priser.hosid=firmaliste.id WHERE hosid = '$hvor' and (nummer = '$sog' or vis = '$sog' or beskrivelse = '$sog' group by priser.id ORDER BY nummer")) || die(mysql_error());
du laver et left join med en anden tabel... kan vi se nogle opsætninger på den også..... vi skal også lige have oplyst hvad der er primary keys og evt andre nøgler....
din left join kan meget let betyde at dit udtræk bliver op til flere tusinde gange langsommere hvis tabellerne der joines imellem ikke er korrekt sat op med unique/primary keys.....
Først og fremmest, hvor- og på hvad er din database placeret ? - hvis du kører på et webhotel, kan du ofte optimere alt det du vel uden nogen synderlig forbedring, fordi du ikke har ret meget indflydelse på serverens totale performance.
Det vil dog altid være en god ide at lave indexes på de felter du oftest anvender i din WHERE clause.
lp >> performance optimering udgøres af mange parametre som du sikkert ved. Jeg så ingen grund til at gentage hvad du allerede har spurgt om, for jeg er fuldstændig enig i, at der kan ligge et problem der.
Men omvendt vil jeg påstå at du ikke kan kalde alt andet sekundært, blot fordi du har spottet et left join, for der er i min verden som udgangespunkt, ikke én eneste parameter, der isoleret set kan vælte læsset. Man kunne principielt lave alle de vanvittige joins man ville, glemme alt om primary- og foreign keys o.s.v. hvis bare serveren er kraftig nok :-)
Du kan gøre flere ting: Bedst forbedring får du ved at etablere indexes på de felter hvorpå du søger. Derefter kan du udelade * fra din selekt. Skal du bruge left join? Måske kan du erstatte den med en where priser.hosid=firmaliste.id. Hvorfor har du en group by med? den giver dig vel ikke noget andet end forøget performance.
<quote> Men omvendt vil jeg påstå at du ikke kan kalde alt andet sekundært, blot fordi du har spottet et left join, for der er i min verden som udgangespunkt, ikke én eneste parameter, der isoleret set kan vælte læsset. Man kunne principielt lave alle de vanvittige joins man ville, glemme alt om primary- og foreign keys o.s.v. hvis bare serveren er kraftig nok :-) </quote> Jeg har da lagt adskillige sindsyge db-servere i mit forsøg på at lave de sygeste left joins.... men hvorfor hente mere end nødvendigt ?
lad os se hvad bahn kan fortælle os om tabellerne !
CREATE TABLE firmaliste ( id int(11) NOT NULL auto_increment, firmanavn varchar(100) NOT NULL default '', adresse varchar(100) NOT NULL default '', post mediumint(4) NOT NULL default '0', city varchar(50) NOT NULL default '', tlf bigint(16) NOT NULL default '0', fax bigint(16) NOT NULL default '0', mail varchar(120) NOT NULL default '', hjemmeside varchar(120) NOT NULL default '', handler text NOT NULL, rabatlimit varchar(50) NOT NULL default '', oprettet bigint(20) NOT NULL default '0', sidst bigint(20) NOT NULL default '0', PRIMARY KEY (id)
men der er kun prislister fra nogle få firmaer. der er nogle af firmaerne der har de samme varernummre så for at kunne se hvor det er billigst, henter jeg firmanavn ud.
når jeg skriver priser.* er det af den simpler årsag at jeg skal bruge alle oplysningerne!
jo det er et webhotel.. men jeg spørger også får at lære :-)
tak for mange gode indlæg. hansk det hjalp gevaldigt at indexere
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.