Toon posts:

[mysql] Optimalisatie hulp.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste luitjes,

ik heb geprobeerd mijn database en query zo snel mogelijk te maken, maar mijn kennis houd hier op.

Zouden jullie mij willen helpen/adviseren om alles te optimaliseren.

Bvd :)

Ik heb drie tabellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TABLE keywords (
   Id int(10) unsigned NOT NULL auto_increment,
   Word varchar(255) NOT NULL,
   PRIMARY KEY (Id),
   UNIQUE Word (Word)
);

TABLE pagekeywords (
   PageId int(10) unsigned DEFAULT '0' NOT NULL,
   WordId int(10) unsigned DEFAULT '0' NOT NULL
);

TABLE pages (
   Id int(10) unsigned NOT NULL auto_increment,
   URL varchar(255) NOT NULL,
   Title varchar(255) NOT NULL,
   Datum int(20) DEFAULT '0' NOT NULL,
   PRIMARY KEY (Id),
   UNIQUE Id (Id),
   UNIQUE URL (URL)
);

en dit is mijn query:
code:
1
2
3
4
5
$query = "SELECT pages.Id AS id
FROM keywords, pagekeywords, pages
WHERE keywords.Word LIKE '%$keyword%'
AND pagekeywords.WordId=keywords.Id
AND pages.Id=pagekeywords.PageId";

Nou weet dat ik indexes moet gebruiken om het sneller te maken, maar ik kom er niet helemaal uit waar ik die nou moet plaatsen?

Kan ik die indexes ook nog aan mijn tabellen toevoegen als die al gevuld zijn, of moet ik die opnieuw vullen?

Alle andere verbeteringen zijn natuurlijk van harte welkom.

Extra info:
TABLE keywords - 61306 records.
TABLE pagekeywords - 517958.
TABLE pages - 2867.

PHP versie 4.06.
MySQL 3.23.32.
OS Linux raq4.

Verwijderd

indices kun je toevoegen op/aan je bestaande tabel
je zet ze op het Word, hoeft niet op het hele woord ligt beetje aan hoe verschillend de trefwoorden zijn. De eerste letters bepalen vaak al of een woord anders is.

Verwijderd

Topicstarter
ik hoef ze dus niet op id's te zetten.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Wat is de PK in pagekeywords? Ik zou een Primary key leggen op de combinatie van de 2 velden die daarin zitten.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 11:39 schreef mvkooten het volgende:
ik hoef ze dus niet op id's te zetten.
HOe bedoel je? Je moet per tabel wel een uniek veld hebben, die dan een primaire sleutel is voor die tabel.

Op bepaalde andere velden (velden waar je op zoekt, sorteert, ...) kun je indices leggen.
Je moet wel afwegen of een index op een bepaald veld wel nodig is. Een index zorgt ervoor dat het opzoeken versnelt, maar als je een insert of een update doet, gaat die index dan wel een vertragende factor zijn.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op woensdag 19 juni 2002 11:40 schreef whoami het volgende:

[..]

HOe bedoel je? Je moet per tabel wel een uniek veld hebben, die dan een primaire sleutel is voor die tabel.

Op bepaalde andere velden (velden waar je op zoekt, sorteert, ...) kun je indices leggen.
Je moet wel afwegen of een index op een bepaald veld wel nodig is. Een index zorgt ervoor dat het opzoeken versnelt, maar als je een insert of een update doet, gaat die index dan wel een vertragende factor zijn.
Ik zou idd een pk bij pagekeywords kunnen maken, maar wordt het daar ook sneller van?

Dat het wat trager wordt bij een Insert is niet zo erg, als de select maar sneller gaat :)

Raad je me aan om dan alleen op Word een index te zetten (omdat ik ook naar de id's zoek)?

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 11:48 schreef mvkooten het volgende:


Ik zou idd een pk bij pagekeywords kunnen maken, maar wordt het daar ook sneller van?
Zoeken op Primary Key is altijd het snelst. Hij (het DBMS) kan dan de unique index gebruiken die de primary key is ipv een table scan uit te voeren.
Raad je me aan om dan alleen op Word een index te zetten (omdat ik ook naar de id's zoek)?
Als die Id's primary keys zijn, dan ligt er toch zowiezo al een index op.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op woensdag 19 juni 2002 11:50 schreef whoami het volgende:

[..]

Zoeken op Primary Key is altijd het snelst. Hij (het DBMS) kan dan de unique index gebruiken die de primary key is ipv een table scan uit te voeren.
[..]
Voor het zoeken op zo'n PK hoef ik niets speciaals te doen met de query, dat gebeurt vanzelf?
Als die Id's primary keys zijn, dan ligt er toch zowiezo al een index op.
Ik heb geen idee...

Ik ga dit iig ff testen, kijken of het al wat sneller wordt :)

Verwijderd

gebruik de explain functie van mysql :)

EXPLAIN SELECT * FROM table;

en dan zie je allemaal nuttige info ;)

Verwijderd

Topicstarter
Beide bedankt, dit ga ik eens rustig doornemen en kijken of mijn botte hersentjes wat wijzer worden ;)

Verwijderd

Topicstarter
WOW :o

Ik kreeg een error al wilde ik een PK maken bij tabel pagekeywords, maar nou heb ik op beide velden een index gemaakt en mijn zoek opdracht werkt SUPERSNELLLLL!!!! :9~

Inplaats van +/- 20 sec naar minder dan 1 sec!!!!! 8-)

BEDANKT!!!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je join met pages is overbodig. De ID komt al uit je pagekeywords tabel.
De LIKE is de performance killer.
Ik denk dat als je niet %$keyword% doet maar $keyword% dat je performance omhoog schiet

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 12:05 schreef Goodielover het volgende:
De LIKE is de performance killer.
Ik denk dat als je niet %$keyword% doet maar $keyword% dat je performance omhoog schiet
Inderdaad, maar als hij nu wil zoeken naar woorden waar 'keyword' in voorkomt, dan moet hij wel %keyword% gebruiken.
Op woensdag 19 juni 2002 12:04 schreef mvkooten het volgende:
WOW :o

Ik kreeg een error al wilde ik een PK maken bij tabel pagekeywords, maar nou heb ik op beide velden een index gemaakt en mijn zoek opdracht werkt SUPERSNELLLLL!!!! :9~

Inplaats van +/- 20 sec naar minder dan 1 sec!!!!! 8-)

BEDANKT!!!
Die error krijg je waarschijnlijk omdat er dubbele records inzitten. Een primary key moet uniek zijn in de tabel.

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

In de FAQ staat nog een stukje over indices van MrX, lees dat nog eens door :)

Verwijderd

Topicstarter
Op woensdag 19 juni 2002 12:08 schreef whoami het volgende:

[..]

Inderdaad, maar als hij nu wil zoeken naar woorden waar 'keyword' in voorkomt, dan moet hij wel %keyword% gebruiken.
[..]
idd ik wil die wildcards wel gebruiken, maar het maakt ook niet meer uit, hij is nu retesnel!!! *D
Die error krijg je waarschijnlijk omdat er dubbele records inzitten. Een primary key moet uniek zijn in de tabel.
Hier heb je ook weer gelijk, maar hoe moet je een PK aan twee fields koppelen? of moet ik RTFM :P

Verwijderd

Topicstarter
Op woensdag 19 juni 2002 13:25 schreef ACM het volgende:
In de FAQ staat nog een stukje over indices van MrX, lees dat nog eens door :)
Lees ik ook ff door.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 13:54 schreef mvkooten het volgende:

Hier heb je ook weer gelijk, maar hoe moet je een PK aan twee fields koppelen? of moet ik RTFM :P
Ja.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op woensdag 19 juni 2002 13:56 schreef whoami het volgende:

[..]

Ja.
ok, viel te proberen. :P

Verwijderd

Topicstarter
Whoami, je merkte eerder op:
Updaten van Primary Keys is imo een slechte zaak. Waarom zou je dat willen doen? Een PK is er om een unieke waarde te geven aan ieder record? Ik zie niet in waarom je die waarde vroeg of laat zou willen wijzigen, en dan moet je nog eens de bijhorende foreign keys ook wijzigen...
Is het dan het beste om de tabel eerst te kopieeren en dan een nieuwe tabel aanmaken met de PK's en dan de data erin te laden?

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 14:16 schreef mvkooten het volgende:
Whoami, je merkte eerder op:
[..]

Is het dan het beste om de tabel eerst te kopieeren en dan een nieuwe tabel aanmaken met de PK's en dan de data erin te laden?
Het is een beetje te zien hoe uw situatie nu is denk ik. Heb je nu een veld in uw tabellen (een uniek veld) dat in aanmerking komt om als PK te gebruiken?
Zoja, dan kun je daarvan een primary key maken.
Zonee, dan zul je een veld moeten toevoegen die je als primary key kunt gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op woensdag 19 juni 2002 14:25 schreef whoami het volgende:

[..]

Het is een beetje te zien hoe uw situatie nu is denk ik. Heb je nu een veld in uw tabellen (een uniek veld) dat in aanmerking komt om als PK te gebruiken?
Zoja, dan kun je daarvan een primary key maken.
Zonee, dan zul je een veld moeten toevoegen die je als primary key kunt gebruiken.
Heb ik je beledigt?
Dat je me nu met u aanspreekt....

In die tabel heb ik idd geen uniek veld, maar het is toch mogelijk om een koppeling te maken van 2 velden?
Of kan dit alleen vooraf?

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 19 juni 2002 14:32 schreef mvkooten het volgende:

Heb ik je beledigt?
Dat je me nu met u aanspreekt....
Neen.
In die tabel heb ik idd geen uniek veld, maar het is toch mogelijk om een koppeling te maken van 2 velden?
Of kan dit alleen vooraf?
Het is mogelijk om dat te doen, op voorwaarde dat de combinatie van deze 2 velden uniek is in de tabel.

https://fgheysels.github.io/

Pagina: 1