v5.dk logo
Kom ind og besøg vores Discord Chat-community
Bliv medlem her eller læs mere om Discord her
1 stor kaffe i byen eller 1 hel md.
som Premium-medlem, valget er dit! :-)

Mere info Køb nu

Premium på v5.dk
v5.dk logo  v5.dk e-learning
Log på med Facebook
  • Log ind på v5.dk
  • Opret bruger
  • Log ind
  • v5.dk Premium
  • v5.dk Premium
  • Hvad siger vores kunder?
  • E-læring for begyndere
  • icon for WordPress 4 e-learning WordPress 4
  • icon for Office 365 e-learning Office 365
  • icon for Microsoft Word e-learning Microsoft Word
  • Bloggen for alle
  • E-læring for nørder
  • icon for PHP-programmering e-learning PHP-programmering
  • icon for iOS Programmering e-learning iOS Programmering
  • icon for Linux Server e-learning Linux Server
  • Bloggen for nørder
  • Arkiverede videoer
  • Fællesskab
  • Forum
  • Idéer og ønsker
  • Markedspladsen
  • v5.dk Premium
  • Gratis webhotel
  • Cloud-servere
  • Om v5.dk
  • Søg på v5.dk
  • Om v5.dk ApS
    • Om virksomheden
    • RSS-feeds og tjenester
    • Driftsmeddelelser
    • Presse-kit
    • Ledige jobs
    • Social Netværk
      • Facebook
      • Twitter
      • Instagram
    • Alt det andet
      • Forretningsbetingelser
      • Ophavsret og Copyright
  • Kontakt kundeservice
  • FAQ og Hjælp
    • Premium og abb.
    • Videoer og Afspiller
    • Forum og Points
    • Cloud-servers
  • Partner/Virksomhed
  • Partner-kanal
v5.dk logo mobile
  • Menu
  • Opret bruger

Indexing MySQL samt slow_query_log

  • v5.dk
  • Forum
  • PHP-programmering
  • Indexing MySQL samt slow_query_log
  • Sidevisninger: 3102 har set dette indlæg
Besvar #0Spørgsmål oprettet af @psto | 3665 points
60 points ude 6 indlæg 6 år siden Spørgsmål besvaret
avatar
 

Hej,

jeg oplever efter serverskift en noget tungere afvikling af MySQL, og et skyldes nok primært nogle tunge query. Umiddelbart kan jeg læse mig til at det bedste man kan gøre for at afhjælpe problemet (nogle gange går den helt i stå), er at sikre at indexeringen er god. Hvordan skal den gennemføres?

 

Derudover kan jeg læse at jeg kan sætte serveren til at logge tunge scripts via slow_query_log - jeg kan bare ikke få det til at virke?

Dette svar er accepteret af OP og tildelt 60 points
avatar
 
Besvar#1 @db Admin svarede for 6 år siden

Hejsa  psto @psto   

Helt korrekt. Indeksering af nødvendigt og et must, når man har meget load og/eller meget data. Nej .. Lad mig omformulere dette - indeksering er ALTID nødvendigt ;) 

Vi er ikke nået hertil i vores PHP- & MySQL-videoer endnu, men det er planlagt som en af de næste emner vi kommer ind på ifm. en ny case hvor vi skal bygge en Password-manager alá 1Password i PHP.

Men indtil vi er klar med dette, lad mig prøve at hjælpe dig her i vores forum, med nogle tips og fifs.

Indeksering går kort fortalt ud på at du laver en indeks over dine data.

Hvis du har en tabel med 100.000 rækker, og INGEN indeksering skal MySQL søge alle 100.000 række igennem hver gang du kører en query op imod din tabel. Selv små tabeller med 1000 rækker uden et index kan trække tænder ud, hvis der er mange queries i sekundet, da alle 1000 rækker da parses hver gang - eller hvis du begynder at lave JOINs mellem andre tabeller, som heller ikke har et INDEX.

Når du har sekunders svartid, lyder det bestemt til at du ikke har fået opbygget korrekte INDEXs, og at problemet kan løses helt, ved at opbygge disse INDEXs.

Et index er kort fortalt en lille opslagsdatabase som MySQL automatisk kan lave,  som gør det muligt for MySQL at finde de data du leder efter, uden at scanne ALLE rækkerne igennem i din tabel - men for at MySQL kan lave et index for dig, er du nød til at hjælpe den lidt på vej, og fortælle den hvad den skal bygge sit index på, altså hvilke felter den skal indeksere.

Forestil dig et Index som en indholdsfortegnelse af en bog, der står hvad side man lede, det er noget hurtigere end at lede hele bogen igennem.

Til og starte med, vil jeg anbefale dig at lave et index på hvert felt i dine tabeller, og herfra kan vi arbejde med at bygge mere smarte indexs. Men hvis du starter med at lave et index på alle dine felter i hver tabel, så er jeg sikker på du tager 98% af dit load væk. Omend det ikke er den smarte løsning, er det en god "starter"-måde at opbygge indexs på.

Du laver et index med følgende SQL:

CREATE INDEX index_name
ON table_name (column_name)

F.eks. hvis jeg har tabellen "Medlemmer" og jeg har tre felter heri: email, navn, postnummer:

CREATE INDEX idx_email
ON Medlemmer (email)

CREATE INDEX idx_navn
ON Medlemmer (navn)

CREATE INDEX idx_postnummer
ON Medlemmer (postnummer)

Jeg vælger at kalde min indexs idx_ + feltnavn, altså idx_email, men dette index-navn er 100% valgfrit.

Du kan også lave lidt mere komplekse indexs hvor du indekserer 2 felter i éet index, hvis du f.eks. ofte laver en query der hedder: WHERE navn = 'Daniel' AND postnummer = 8000 giver det mening at lave et index der indeholder begge felter:

CREATE INDEX idx_navnpostnummer
ON Medlemmer (navn, postnummer)

Håber dette hjælper dig lidt på vej, ellers er vi klar til at hjælpe dig.

God weekend


Med venlige hilsner

Daniel Bahls Signatur   Daniel Bahl (@db)
   CEO – v5.dk ApS

avatar
 
Besvar#2 @psto kommenterede for 6 år siden

Hej Daniel

Jeg har nok ikke helt forstået hvordan jeg udnytter indeksering korrekt, trods din udførlige beskrivelse. Som jeg forstår det, anbefaler du at lave indeksering på ALLE kolonner i tabellerne. Hvilken effekt giver det? Og vedligeholder indekseringen sig selv efterhånden som der kommer flere rækker i tabellen?

I phpMyAdmin er der en funktion der under "Struktur" for den enkelte tabel og kolonne hedder "Indeks". Den laver en SQL der hedder

ALTER TABLE  `table_name` ADD INDEX (  `column_name` ) ;

 Giver det samme effekt? I phpMyAdmin findes ydermere mulighed for at Indeksere samtlige rækker i tabellen. Giver det samme effekt?

Hvad opnår jeg ved at lave din SQL hvor jeg kalder alle index samme navn med et prefix - er det synlighed over hvilke kolonner der er indexeret eller ? 

Mange hilsner - Patrick

Redigeret af psto @psto  d. 09.04.2016 kl. 11:14
avatar
 
Besvar#3 @db Admin kommenterede for 6 år siden

Hejsa,

Yep, et index vedligeholder sig selv når der kommer nye rækker - og det gælder automatisk for ALLE rækker i en tabel.

Jeg vil anbefale dig at starte med at lave et index for hver kolonne. Så er du rigtigt langt, så er MySQL nemlig selv så klog, at den finder det index der passer bedst til den aktuelle QUERY der skal løses.

Herefter kan du begynde at lave lidt mere smarte INDEXs, lad os sige du ofte kalder en QUERY der lyder således:

SELECT firstName, email FROM Members WHERE firstName = ? AND lastName = ?

Her vil det så give mening at lave éet INDEX der indeholde to kolonner, nemlig både firstName og lastName, ex.:

CREATE INDEX idx_fullname
ON Members (firstName, lastName)

Navnet på et index er fuldstændig ligegyldigt, du kan kalde det "pstoTomatSovs", hvis du lyster. Det er blot for at have- og holde en standard. 

Du kan se alle indexs for en given tabel ved at køre denne QUERY:

SHOW INDEX FROM Members;

Med venlige hilsner

Daniel Bahls Signatur   Daniel Bahl (@db)
   CEO – v5.dk ApS

avatar
 
Besvar#4 @psto kommenterede for 6 år siden

... og skal et indeks opdateres hver gang der laves ændringer i rækker (ændres/tilføjes/slettes) ?

avatar
 
Besvar#5 @psto kommenterede for 6 år siden

Du var simpelthen hurtigere til at svare, end jeg var til at tænke mig om :D

avatar
 
Besvar#6 @psto kommenterede for 6 år siden

 #3  Nu tror jeg jeg har fattet budskabet! 

Men har det stadig en effekt hvis jeg blot laver indeksering af ALLE kolonner? 

Spørgsmålet er besvaret, men du er altid mere end velkommen til at skrive en kommentar!
avatar
 

Du er ikke logget ind

Du skal være logget ind på v5.dk før du kan benytte vores forum. Det er ganske gratis at oprette en bruger.

Opret en ny gratis bruger Log ind

Følger med i denne tråd

psto db

Forum kategorier

  • Generelt
  • Guides & Howto85
  • Offtopic / Andet160
  • Microsoft Office
  • Microsoft Word13
  • Microsoft Excel4
  • Microsoft PowerPoint0
  • Web og hjemmesider
  • Wordpress17
  • Operativsystemer
  • Apple Mac OS X14
  • Apple iOS28
  • Microsoft Windows4
  • Linux16
  • Teknologier
  • Netværk og WiFi3
  • Internet-tjenester9
  • Programmering
  • PHP-programmering125
  • iPhone-/Xcode-programmering9

Aktive forum-tråde lige nu

pentobarbital kaufen ohne rezept
gras kaufen online - grasthc.com
online marketing
Køb juridiske dokumenter såsom kørekort, pas, visum, opholdstilladelse og andre dokumenter
Køb juridiske dokumenter såsom kørekort, pas, visum, opholdstilladelse og andre dokumenter
Weed online kaufen
Er det værd at have en "portfolio"-hjemmeside!?
Fejlkode i form af bip-lyde ved opstart af gammel stationær PC
Bygget med af v5.dk
© Copyright 2006-2023 • Forretningsbetingelser • Copyright • Persondata- og Cookiepolitik
v5.dk ApS - Åbogade 15 - 8200 Aarhus N - CVR: 36902833
v5.dk logo
Hej, vi hedder v5.dk og vi laver e-learning på dansk

v5.dk er sat i verden for at gøre teknologi tilgængeligt og anvendeligt for både professionelle og almindelige brugere på alle niveauer.

93 200 555
  Skriv til os
v5.dk bruger cookies til at huske dine indstillinger, livechat samt til statistik
 

Alle vores priser er inkl. moms Sikker SSL-beskyttet forbindelse

Dankort og Visa-Dankort  Visa  Mastercard og Mastercard Junior  Maestro

  • Produkter
  • v5.dk Premium
  • Cloud-servers
  • v5.dk
  • Om v5.dk
  • Kunderne siger
  • Kontakt os
  • Presse
  • Stay updated
  • RSS & tjenester
  • Søg på v5.dk
  • Sitemap