Toon posts:

Langdradig MySQL Procces

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een zoeksysteempje gemaakt die in 250000 records zoekt.
Het zoeken duurt vresenlijk lang (ik geloof wel 11 seconden)

Ik zoek in mijn systeem op "landbouw"

hier even online laten zien:

http://www.bedrijfje.biz/...ame&pc=&country=Nederland

ik heb nu geen postcode ingevult.

Maar zoek ik in mijn systeem op "landbouw" en vul ik een postcode in bijv "8", het systeem zoekt dan op alle postcodes die met een 8 beginnen (8***)

http://www.bedrijfje.biz/...me&pc=8&country=Nederland

Dat gaat daar in tegen heerlijk snel. (hoe minder resultaten hoe sneller)

ik maak gebruik van de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$select_gebruiker = "SELECT HIGH_PRIORITY gebruikers.idgebruikers, 
gebruikers.naam,vestigingen.idvestigingen,gebruikers.idgebruikers, 
vestigingen.postcode,vestigingen.plaats,vestigingen.website,vestigingen.adres,ves
tigingen.email,vestigingen.telefoonnummer,hoofdcategorieen.hoofdcategorienaam 
FROM `gebruikers`,`vestigingen` , `hoofdcategorieen`   WHERE 
gebruikers.idgebruikers = vestigingen.gebruikersid AND 
hoofdcategorieen.idhoofdcategorie = gebruikers.hoofdcategorieid  AND 
vestigingen.land = '" . $_GET['country'] . "' AND vestigingen.postcode LIKE '" . 
$_GET['pc'] . "%'  AND MATCH(gebruikers.naam) AGAINST('*" . $trefwoord . "*' IN 
BOOLEAN MODE)    ORDER BY  hoofdcategorienaam ASC, plaats ASC, adres ASC, 
naam ASC Limit 0,20; ";

                
$select_gebruiker_query = mysql_query($select_gebruiker) or die($main->show_error(mysql_error()));
$aantal = mysql_num_rows($select_gebruiker_query);


Wat het rare is, mijn database velden zijn geindexeerd, maar niet fulltext geindexeerd. (wanneeer ik fulltext indexeer wordt het zoeken nog veel slomer!)
Wat kan ik doen??

- De site staat in zijn eentje op een server.
- Server Specificaties zijn amd XP 2400, 512 MB DDR
- Mysql versie 4
- PHP versie 4.3.4
- Apache 1.3

Iemand tips, om het te versnellen of om het probleem op te lossen?

[ Voor 5% gewijzigd door Verwijderd op 13-04-2004 20:53 ]


Verwijderd

LIKE in je query is sowieso traag. Daarnaast: hoe heb je je indexes gelegd? over elke kolom een aparte index of over meerdere kolomen één index? Daarnaast gebruik je wildcards in je MATCH, das ook wat aan de langzame kant, want daardoor moetie gewoon veel meer doorzoeken dan bij het gebruik van 'hele' woorden.

Ik zou eens wat gaan testen met alleen het gebruik van een fulltext of zoals ik hieronder je code heb uitgelijng en alleen gebruikmakend van LIKE in je query. 250.000 is niet waanzinnig veel en het lijkt erop dat je je indexen niet goed hebt geplaatst. Je zou daar eens mee kunnen spelen.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT HIGH_PRIORITY 
    g.idgebruikers, 
    g.naam,
    v.idvestigingen,
    v.postcode,
    v.plaats,
    v.website,
    v.adres,
    v.email,
    v.telefoonnummer,
    h.hoofdcategorienaam 
FROM 
    gebruikers AS g,
    vestigingen AS v,
    hoofdcategorieen AS h
WHERE 
    g.idgebruikers = v.gebruikersid
    AND 
    h.idhoofdcategorie = g.hoofdcategorieid
    AND 
    v.land = '".$_GET["country"]."'
    AND
    v.postcode LIKE '".$_GET["pc"]."%'
    AND
    g.naam LIKE '%".$trefwoord."%'
ORDER BY
    hoofdcategorienaam ASC,
    plaats ASC,
    naam ASC,
    adres ASC
Limit 0,20

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Probeer eens het stukje
code:
1
vestigingen.postcode LIKE '" . $_GET['pc'] . "%'

uit de query te halen wanneer pc leeg is. Ik vermoed dat een like tegen een % erg inefficient is, hoewel ik ook zou verwachten dat de query optimizer zo'n stuk van de query zou negeren.

Verwijderd

Topicstarter
Jullie hebben me aan het denken gezet! En ik ben dus gaan knoeien met de codes.

Ik heb allereerst alle order By Codes er uit gehaalt.
En deze wordt nou gesorteerd met een array.

(De orders kosten heelveel tijd)

Vervolgens heb ik het opgesplitst:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$select_gebruiker           = "
                                            SELECT 
                                                g.IdVestigingen
                                            FROM 
                                                `gebruikers` AS `g`,
                                                `vestigingen` AS `v`  
                                            WHERE 
                                                g.idgebruikers = v.gebruikersid AND 
                                                v.land = '" . $_GET['country'] . "' AND
                                                v.postcode LIKE '" . $_GET['pc'] . "%' AND 
                                                MATCH(g.naam) 
                                                AGAINST('*" . $trefwoord . "*' IN BOOLEAN MODE) 
                                                Limit 0,20; ";
                                                
                $select_gebruiker_query     = mysql_query($select_gebruiker) or die($main->show_error(mysql_error()));
                $aantal                     = mysql_num_rows($select_gebruiker_query);
                
                
                while(  $select_gebruiker_rijen = mysql_fetch_assoc($select_gebruiker_query)    )
                {
                    
                    $select         = "Select * From vestigingen Where IdVestigingen = '" . $select_gebruiker_rijen['IdVestigingen'] . "'";
                    $select_query   = mysql_query($select) or die(mysql_error());
                    $select_rijen   = mysql_fetch_assoc($select_query);
                    
                    $select_user    = "Select naam From gebruikers where IdGebruikers = '" . $2select_rijen['GebruikersId'] . "'";
                    $select_user_go = mysql_query($select_user) or die(mysql_error());
                    $select_user_row= mysql_fetch_assoc($select_user_go);


De parse tijd is gedaalt naar 1 sec!

Jongens Bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
bigbeng schreef op 13 april 2004 @ 21:16:
Probeer eens het stukje
code:
1
vestigingen.postcode LIKE '" . $_GET['pc'] . "%'

uit de query te halen wanneer pc leeg is. Ik vermoed dat een like tegen een % erg inefficient is, hoewel ik ook zou verwachten dat de query optimizer zo'n stuk van de query zou negeren.
Het is net de bedoeling van LIKE dat je een wildcard kan meegeven. Zolang je de wildcard achter je zoekstring zet, dan is het toch nog snel, aangezien de eventuele indexen nog altijd kunnen gebruikt worden.
Zet je je wildcard voor je zoekstring, dan moet ie gaan scannen, wat dus heel wat trager gaat.

https://fgheysels.github.io/


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als je mn reactie goed leest zeg je precies hetzelfde als ik. Namelijk dat het inefficient is als de '%' vooraan in de string staat. Dit gebeurt als postcode leeg is.

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 28-02 19:26
bigbeng schreef op 15 april 2004 @ 17:41:
Als je mn reactie goed leest zeg je precies hetzelfde als ik. Namelijk dat het inefficient is als de '%' vooraan in de string staat. Dit gebeurt als postcode leeg is.
Ik nme toch aan dat je dat wel in je code afvangt? Zonder 'where-clause' is altijd sneller als WHERE <field> LIKE '%%'. Alhoewel ik denk dat MySQL daar niet echt op gaat zoeken...

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart

Pagina: 1