Avatar billede bahn Nybegynder
11. juni 2002 - 22:48 Der 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!
Avatar billede ztyxx Nybegynder
11. juni 2002 - 22:50 #1
SQL for søgningen??
Avatar billede repsac Nybegynder
11. juni 2002 - 22:53 #2
=>ztyxx: LIKE - eks: SELECT * FROM tabelnavn WHERE efternavn LIKE '%eterse%'...
Avatar billede repsac Nybegynder
11. juni 2002 - 22:54 #3
varchar er langsommere end char, ved ikke rigtig hvor hurtig decimal er, men prøv at se noget doc. på www.mysql.com :)
Avatar billede bahn Nybegynder
11. juni 2002 - 22:54 #4
søgning=

($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());
Avatar billede ztyxx Nybegynder
11. juni 2002 - 22:55 #5
hehe repsac, det jeg var ude efter er hvordan bahn hiver det ud
Avatar billede ztyxx Nybegynder
11. juni 2002 - 22:57 #6
ORDER BY nummer 
skal du ikke have asc eller desc der
Avatar billede repsac Nybegynder
11. juni 2002 - 22:58 #7
=>ztyxx: nårh... :) - ville da også mene at du burde kende til det... :)
Avatar billede ztyxx Nybegynder
11. juni 2002 - 23:00 #8
LOLLER lige @ repsac
Avatar billede gizmo-gizmo Nybegynder
11. juni 2002 - 23:02 #9
ztyxx >> Det er da ikke nødvendigt med ASC eller DESC. ASC er default.
Avatar billede ztyxx Nybegynder
11. juni 2002 - 23:04 #10
giz> ved det, men der er ikke grund til at fylde mere kode i end højst nødvendigt, hvis man alligevel skal sortere ASC
Avatar billede lp Nybegynder
11. juni 2002 - 23:07 #11
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.....
Avatar billede gizmo-gizmo Nybegynder
11. juni 2002 - 23:07 #12
ztyxx >> han fylder da heller mere kode på en højst nødvendigt så ? :)
Avatar billede tmceu Praktikant
11. juni 2002 - 23:19 #13
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.
Avatar billede lp Nybegynder
11. juni 2002 - 23:26 #14
altså, server performance etc er ligesom sekundært lige nu. Gutten laver et LEFT JOIN... hvis ikke i kender formlen for det kan jeg oplyse jer det:

antallet af mulige records i tabel1 x antallet af mulige records i tabel2

hvis vi så tror på at han ikke har nogle primary keys og har:

10.000 kunder og
200.000 varer

bliver det til 10.000 x 200.000 = 2.000.000.000 records db'en skal sortere ved HVER ENESTE søgning !

er det primary keys kan dette tal justeres ned til blot 1 :)
Avatar billede lp Nybegynder
11. juni 2002 - 23:27 #15
altså 1 x måske 50 mulige records = 50 records... forskellen er stooor :)
Avatar billede tmceu Praktikant
11. juni 2002 - 23:34 #16
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 :-)
Avatar billede hansk Nybegynder
12. juni 2002 - 00:14 #17
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.
Avatar billede morw Nybegynder
12. juni 2002 - 00:29 #18
Brug EXPLAIN til at se hvordan MySQL bruger dine indexs.

Sæt EXPLAIN foran de query og vis os output'et her
Avatar billede lp Nybegynder
12. juni 2002 - 01:40 #19
<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 !
Avatar billede tmceu Praktikant
12. juni 2002 - 02:07 #20
lp >> det er egentlig sjovt hvor enige vi kan være i ét spørgsmål og så delvist uenige i dette :-)

Som jeg skrev er jeg helt enig i dit forslag, men det er stadig en skyklaps-metode at konkludere at alt andet er sekundært.
Avatar billede bahn Nybegynder
12. juni 2002 - 18:56 #21
firmalisten er således ud:

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 :-)
Avatar billede bahn Nybegynder
12. juni 2002 - 19:04 #22
hvad mener i når i siger indexere eller gøre unik en kort forklaring ønskes eller et sted med god dokumentation
Avatar billede morw Nybegynder
12. juni 2002 - 19:33 #23
Brug explain så kan du hurtig se om den bruger dine index. Alt står på www.mysql.com
Avatar billede bahn Nybegynder
12. juni 2002 - 20:10 #24
jeg tror jeg skal have fat i noget indexering...
kan man indexere alle tre kolonner jeg søger i eller kun en?
Avatar billede bahn Nybegynder
12. juni 2002 - 20:14 #25
tak for mange gode indlæg.
hansk det hjalp gevaldigt at indexere
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester