Hov. Du er ikke logget ind.
DU SKAL VÆRE LOGGET IND, FOR AT INTERAGERE PÅ DENNE SIDE

MySQL spørgsmål: Hvordan/hvad er INDEX...

Side 1 ud af 1 (10 indlæg)
  • 1
Tilmeldt 21. Nov 11
Indlæg ialt: 134
Skrevet kl. 03:28
Hvor mange stjerner giver du? :

Jeg har en MySQL database som bruger for mange serverkræfter og nu har jeg gennemgået mine SQL-kald og det er ikke ret voldsomme så jeg tror ikke det er dem der driller.

Men måske er det min database opsætning.

Jeg har en tabel der hedder Billeder (110.000 poster) og en der hedder Kalender (2000 poster) som er relateret sammen.

Billeder tabel:

id - (index) og autonummerering

ref - Det er ID nummeret på den post i tabellen Kalender hvor billederne er fra.

Så er der en masse andre felter såsom opløsning, format, filnavn osv. lignende billedinfo om den enkelte fil.

Kalender tabel:

kampid - (index) og autonummerering (Det er dette nummer der refereres til i Billeder-tabellen i feltet ref.

Begivenhed

Dato

Kategori ID - Henter det fra en Kategori-tabel

Hold ID1 - Henter det fra en Hold-tabel

Hold ID2 - Henter det fra en Hold-tabel

OSV. med en nogle felter med info som der ikke søges i.

Når jeg henter en side med en oversigt over alle billeder der har ref (Billeder-tabel)/kampid (Kalender-tabel) så overbelaster det MySQL-serveren.

Har jeg ikke forstået det rigtigt det med INDEX i en tabel. Alle mine tabeller har jeg markeret INDEX ved det felt som er ID (unikt for alle poster)

Men skal jeg sætte INDEX på flere felter f.eks. alle dem der indeholder ID'er der har relationer (søger/henter) fra andre tabeller eller hvordan?

Vil det kunne mindske min serverbelastning?

/Magnus

Fra London
Tilmeldt 11. Dec 07
Indlæg ialt: 373
Skrevet kl. 05:42
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person

Hej,

Et index fungerer ligesom et indeks i en bog. Hvis du forestiller dig at du har en liste med billeder, som ser således ud:

1. Billed1
2. Billed2
3. Billed3
4. Billed4
5. Billed5

Hvis du så laver følgende MySQL-query: SELECT * FROM billeder WHERE id = 3 så gør databasen følgende:

- Den kigger på Billed1, dens id er ulig 3, så vi fortsætter søgningen

- Den kigger så på Billed2, dens id er ulig 3, så vi fortsætter søgningen

- Den kigger så på Billed3, dens id er ulig 3, så den række returnerer vi.

Denne proces kan tage vildt lang tid hvis du har en database med 100.000 af rækker uden noget index. Derfor kan det være smart at benytte indexes på ting som der bliver søgt efter. Hvis vi skal se på ovenstående søgning ved hjælp af en indeks:

- Databasen kigger i indekset efter id = 3, og returnerer det.

Man kan så spørge sig selv, hvorfor putter man så ikke bare indexes på alle kolonner? Dette gøres ikke fordi der er behov for at opdatere indexes hver gang man indsætter noget i tabellen. Et index giver hurtig læsning, men en sløvere skrivning. 

En regel til at huske indexes er: Altid index på foreign keys (da de ofte bliver brugt i joins) og altid index på id'er. 

En anden ting du kan gøre for at teste dine queries er at benytte dig af MySQLs EXPLAIN funktionalitet på dine mest benyttede queries. Denne er ret praktisk, da den fortæller dig hvilke indexes en query bruger, hvis nogen. Dette gøres ved at logge ind på din MySQL server, eventuelt gennem kommandolinjen og skriver EXPLAIN SELECT * FROM billeder WHERE id = 3.

Du kunne også begynde at kigge på caching af resultater hvis du har en query som kører meget ofte, og som ikke behøver at blive kørt konstant. 

Hiv gerne fat i mig hvis du har behov for hjælp, jeg hjælper meget gerne og burde have et par timer denne weekend til at kigge på det. Min mail er: kaspergrubbe@gmail.com eller skype: kasper.grubbe

Fra København
Tilmeldt 22. Jul 10
Indlæg ialt: 338
Fra  Jivana Skrevet kl. 13:17
Hvor mange stjerner giver du? :

Indy:
kampid - (index) og autonummerering (Det er dette nummer der refereres til i Billeder-tabellen i feltet ref.

Udover index på primary key (den unikke id) bør du minimum have index på fremmedenøgler i tabeller og evt. også populære søgefelter .
Oftest laves index på primary key automatisk af databasesystemet 

I dit tilfælde er feltet ref i tabellen Billeder fremmednøgle fordi den peger over til relevant post i tabellen Kalender

***

Bonus kommentar: Det er god praksis at lade oprindelig feltnavn indgå i navnet på fremmednøglen. I dit tilfælde f.eks. kalde felte ref  for ref_kampid eller fk_kampid eller blot bruge det samme feltnavn, kampid. En sådan praksis gør det nemmere at gennemskue hvilke referencer der er mellem tabeller - og hvilke felter man bør lave index på :-)

Glad indehaver af Jivana webshop - vi sælger Økologisk kosmetik og makeup - tjek os ud!

Tilmeldt 21. Nov 11
Indlæg ialt: 134
Skrevet kl. 00:43
Hvor mange stjerner giver du? :

Tak for de fine svar hvor jeg fik det med INDEX på plads så min database ikke bliver overbelastet.

Jeg lavede nu index på alle felter som der skal søges i og håbede at det var løsningen. Men jeg fik svar at mit database kald stadig bruger for for mange af serverens kræfter.

Men hvad er det som er så krævende fra min server:

Dette er mit SQL hvor jeg har markeret hvad der er index.

SELECT
Kalender.antal,
Kalender.hold1, (INDEX)
Kalender.hold2, (INDEX)
Kalender.hold1t,
Kalender.hold2t,
Kalender.dato,
Kalender.titel,
Kalender.subtitel,
Kalender.subref,
Kalender.indexfoto,
Kalender.turnering,
Kalender.turneringt,
Kalender.kategori,  (INDEX)
Kalender.gruppe,
Kalender.status,
Kalender.antal,
Kalender.beskrivelse,

Billeder.id, (INDEX)
Billeder.sti,
Billeder.ref, (INDEX)
Billeder.filkode,
Billeder.tekst,
Billeder.keywords,
Billeder.width,
Billeder.height,
Billeder.iso,
Billeder.kamera,
Billeder.vist, (INDEX)
Billeder.visttotal, (INDEX)
Billeder.filkode,
Billeder.filkode2,
Billeder.filnavn_old,
CONCAT(subtitel,': ',titel) AS titeltotal,
Kategori.sportsgren

FROM Billeder, Kalender LEFT JOIN Kategori ON Kalender.kategori=Kategori.id

WHERE
Kalender.id>'0' AND (userid='0' OR userid='') AND
((Billeder.ref=Kalender.id AND Kalender.gruppe='' AND Billeder.ref='1344')
 OR (Billeder.id>'0' AND Kalender.gruppe<>'' AND Billeder.settings LIKE Kalender.gruppe AND Kalender.id='1344'))

GROUP BY Billeder.id ORDER BY Kalender.dato, Billeder.id, Billeder.capturetime, Billeder.id LIMIT 0, 60

Er det fordi jeg trækker data ud af så mange felter, eller er det fordi jeg har to tabeller (Kalender og Billeder) hvor Billeder jo har over 100.000 poster.

Hvad er det som gør det så svært for min server er der nogen der har en ide?

Vil det være en ide at dele det op i to SQL-kald en der henter billeder og en der henter info i Kalender-tabellen?

Håber I gider hjælpe mig for ellers lukker min udbyder tilsidst min webshop.

/Magnus

Fra London
Tilmeldt 11. Dec 07
Indlæg ialt: 373
Skrevet kl. 03:28
Hvor mange stjerner giver du? :

Hej,

Prøv at lave en

EXPLAIN SELECT 

Kalender.antal, 
Kalender.hold1,
Kalender.hold2,
Kalender.hold1t, 
Kalender.hold2t, 
Kalender.dato, 
Kalender.titel, 
Kalender.subtitel, 
Kalender.subref, 
Kalender.indexfoto, 
Kalender.turnering, 
Kalender.turneringt, 
Kalender.kategori,
Kalender.gruppe, 
Kalender.status, 
Kalender.antal, 
Kalender.beskrivelse, 

Billeder.id,
Billeder.sti, 
Billeder.ref,
Billeder.filkode, 
Billeder.tekst, 
Billeder.keywords, 
Billeder.width, 
Billeder.height, 
Billeder.iso, 
Billeder.kamera, 
Billeder.vist,
Billeder.visttotal,
Billeder.filkode, 
Billeder.filkode2, 
Billeder.filnavn_old, 
CONCAT(subtitel,': ',titel) AS titeltotal, 
Kategori.sportsgren 

FROM Billeder, Kalender LEFT JOIN Kategori ON Kalender.kategori=Kategori.id 

WHERE 
Kalender.id>'0' AND (userid='0' OR userid='') AND 
((Billeder.ref=Kalender.id AND Kalender.gruppe='' AND Billeder.ref='1344')
 OR (Billeder.id>'0' AND Kalender.gruppe<>'' AND Billeder.settings LIKE Kalender.gruppe AND Kalender.id='1344'))

GROUP BY Billeder.id ORDER BY Kalender.dato, Billeder.id, Billeder.capturetime, Billeder.id LIMIT 0, 60

Og giv svaret til os :)

Tilmeldt 21. Nov 11
Indlæg ialt: 134
Skrevet kl. 11:57
Hvor mange stjerner giver du? :

Hvor skal jeg afvikle min SQL med EXPLAIN foran?

Er det i selve koden på min hjemmeside eller hvor?

Når jeg går in di phpMyAdmin og indsætter den i SQL-kør vinduet får jeg bare en besked om at den er kørt korrekt.

/Magnus

Fra London
Tilmeldt 11. Dec 07
Indlæg ialt: 373
Skrevet kl. 12:59
Hvor mange stjerner giver du? :

Du kan godt køre den i PHPMyAdmin, når du får at vide at queryen er kørt korrekt, så kan du trykke detaljer eller "Show details" eller noget i den stil.

Hvis din MySQL-server tillader eksterne forbindelser kan du også gøre det med et værktøj som Navicat: http://www.navicat.com/ (der er både Windows, Linux og OSX udgaver) eller andre lignende værktøjer. 

Tilmeldt 21. Nov 11
Indlæg ialt: 134
Skrevet kl. 15:15
Hvor mange stjerner giver du? :

Når jeg kører min SQL  med EXPLAIN foran så får jeg denne boks i phpMyAdmin:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1 SIMPLE Kalender const PRIMARY,id,gruppe,userid PRIMARY 4 const 1 Using filesort
1 SIMPLE Kategori const PRIMARY PRIMARY 4 const 1  
1 SIMPLE Billeder range PRIMARY,ref ref 4 NULL 257 Using where

Jeg kan ikke forstå eller se hvad eller hvor problemet ligger.

Har igen gennemgået alle mine database kald da det eneste jeg får fra mit webhotels support er starten af SQL-sætningen som volder problemer. Den bruges bare på så mange sider så jeg ikke kan se hvilken en.

Nu har jeg i som det første i alle mine SQL indsat:

CONCAT('" & Request.ServerVariables("SCRIPT_NAME") & "',' = gallerihoved.inc') AS filnavn,

Så vil jeg kunne se nøjagtig på hvilken side og hvilken fil som skaber den SQL- der giver problemer.

Jeg kæmper en lang hår kamp for det vare ikke længe før mit webhotel lukker min webshop er der nogen der kan hjælpe I kan få adgang til min database og se om jeg har opsat mine tabeller rigtigt og mest effektivt.

Det mener jeg at jeg har men for en uge siden viste jeg ikke hvad INDEX var så måske det er der et sted.

Jeg syntes ikke at mine database kald er meget komplicerede syntes jeg eller hvad.

Håber meget at finde problemet men det er lidt svært at fejlfinde når man ikke selv kan se resultat af ens rettelser men blot skal vente på at support-afdelingen kontakter en. Er der ikke en måde hvor jeg selv kan kontrollere hvor megen tid/belastning mit database kald resulterer i så jeg kan se om det bliver bedre eller værere.

/Magnus

Fra London
Tilmeldt 11. Dec 07
Indlæg ialt: 373
Skrevet kl. 16:55
Hvor mange stjerner giver du? :

Hvis du kigger på din liste, så kan du se at den første siger følgende:

Table: Kalender
possible_keys: PRIMARY,id,gruppe,userid
Extra: Using filesort 

'Using filesort' betyder at din database laver en temporær tabel, søger det hele igennem, finder hvad den skal, og smider den midlertidige tabel væk. Det vil du helst ikke ud i. Du kan prøve at oprette indekser på: id,gruppe,userid. Det kan virke lidt vildt med så mange indexes, så prøv en ad gangen, men hvis querien er brugt ofte, kan du nok godt leve med så mange indexes.

Table: Billeder
possible_key: ref
Extra: Using where 

'Using where' er sløvere end 'using index', du kan risikere at selvom du har et index på ref at den alligevel bruger 'Using where' hvis du tillader NULL values på ref. Hvis du ikke har et index på ref, kan du prøve at tilføje det, hvis du har et index kan du prøve at tilføje NOT NULL på ref.

Der er langt mere info her: http://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain_extra

Tilmeldt 21. Nov 11
Indlæg ialt: 134
Skrevet kl. 17:27
Hvor mange stjerner giver du? :

Umiddelbart sår har jeg index på de felter som du foreslår.

Hvad mener du når du siger: 'Using where' er sløvere end 'using index'?

Er der en anden måde at skrive sine WHERE-betingelser som herunder eller hvad?

SELECT * FROM Kalender WHERE id='34'

Er utrolig glad for din hjælp da jeg er meget på røven og famler lidt i blinde.

/Magnus

Side 1 ud af 1 (10 indlæg)