Toon posts:

[MySQL] traagheid bij veel records *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een tabel met een miljoen records.
Begint al aardig uitgebreid te worden.
Maar je merkt het aan de snelheid bij het opvragen met een query uit de tabel. Dat gaat trager en trager.

Ik gebruik zoiets:
SELECT * from grotetabel
while{

SELECT * from kleinetabel1 where ...
while {
}


SELECT * from kleinetabel2 where ...
while {
}

....

}

Is dat normaal, dat dat trager en trager gaat?

Ik heb op de site van mySQL gelezen dat de tabellen zeer groot kunnen worden, maar er staat niets bij betreffende de snelheid.

Als je in plaats van SELECT *, SELECT COLUMN1, COLUMN3, ...
dus enkel de kolommen die je nodig hebt invult gaat het al sneller bij het opvragen met de query, maar nog niet snel genoeg.

  • Femme
  • Registratie: Juni 1999
  • Laatst online: 19:11

Femme

Hardwareconnaisseur

Official Jony Ive fan

Als je alleen maar SELECT * FROM tabel doet kan ik me erg goed voorstellen dat het steeds trager wordt :D .

Zijn de tabellen goed geïndexeerd? Bij een goed geïndexeerde tabel zou het aantal records geen grote invloed op de performance moeten hebben.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:04
En Optimizen?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

ik zal ff een testje posten van me die ik laatste heb gedaan :)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
test verslag
query1:
    $query="
        SELECT 
            id,
            topicid,
            userid,
            text,
            timestamp 
        from 
            forum_posts
    ";
query2:
    $query="
        SELECT 
            *
        from 
            forum_posts
    ";
    
aantal herhalingen:
25

uitgevoerd op www.happyfun.nl
aantal records: 6100

rest code:
    $result=mysql_query($query);
    while ($item = mysql_fetch_row($result))
    {
        //print_r($item);
        //echo "<br>";
    }   

resultaat: (3x ter referentie en vergelijk)

q1: 24.997175 21.859552 18.958795 |gemiddeld: 21.9385
q2: 35.081239 32.112438 31.418007 |gemiddeld: 32.9705

conclusie:
op 25 x 6100  records een verschil van  11.58 seconden!!!!!

doe er je voordeel mee :)

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Op dinsdag 05 maart 2002 17:49 schreef Femme het volgende:
Als je alleen maar SELECT * FROM tabel doet kan ik me erg goed voorstellen dat het steeds trager wordt :D .

select * werkt beter, maar soms heb je gewoon alle kolommen nodig

Zijn de tabellen goed geïndexeerd? Bij een goed geïndexeerde tabel zou het aantal records geen grote invloed op de performance moeten hebben.
geïndexeerd, bedoel je "uniek" veld?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 20:33

pistole

Frutter

-doe nooit een SELECT *
-gebruik altijd een WHERE clause

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Nu online
Op dinsdag 05 maart 2002 17:49 schreef Femme het volgende:

Zijn de tabellen goed geïndexeerd? Bij een goed geïndexeerde tabel zou het aantal records geen grote invloed op de performance moeten hebben.
Je moet er ook voor zorgen dat de statistics up to date blijven.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ben even een test aan het uitvoeren

Verwijderd

Op dinsdag 05 maart 2002 18:00 schreef pistole het volgende:
-gebruik altijd een WHERE clause
En als je dan alle meuk wilt hebben ? moet ie per tupel een vergelijking gaan oplossen

Verwijderd

Topicstarter
$result = mysql_query("SELECT * FROM kleinetabel1 where COLUMN2='bla'", $db);
while ($myrow = mysql_fetch_row($result)) {
$g1=$g1+1;

$result2 = mysql_query("SELECT * FROM kleinetabel2 where COLUMN1=$myrow[1]", $db);
while ($myrow2 = mysql_fetch_row($result2)) {
printf("$myrow2[0], $myrow2[1]<BR>");
$g2=$g2+1;
}

$result3 = mysql_query("SELECT * FROM grotetabel where colum1=$myrow[1] and column2='bla'", $db);
while ($myrow3 = mysql_fetch_row($result3)) {
printf("$myrow3[0], $myrow3[1], $myrow3[2]<BR>");
$g2=$g3+1;
}

}

begintijd: 182001

61 records als resultaat

eindtijd: 182331


grotetabel: 100000 records in totaal
kleinetabel1: 8500 records in totaal
kleinetabel2: 500 records in totaal

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 05 maart 2002 18:30 schreef jchris het volgende:
eindtijd: 182331
300 milliseconden of seconden?
Of minuten?

Maar vervang nou die *'s es door de velden die je nodig hebt. Btw, wat probeer je hier te testen? :)
Als je dan de queries per stuk 100x ofzo afschiet en per "tabel" bepaald hoelang het duurt heeft de test nog es nut... ;)

Verwijderd

Topicstarter
heb eigenlijk alle velden nodig...

tijd:
18u20min01sec
18u23min31sec

foutje:
grotetabel: 1 000 000 records

Verwijderd

Topicstarter
Aparte queries:

grotetabel

met SELECT * from tabel:

begintijd: 18:50
eindtijd: 18:53:21, 100 records opgevraagd

met select COLUMN1, COLUMN2, COLUMN3, COLUMN4 wordt dat:

begintijd: 18:57:52
eindtijd: 19:00:15, 100 records

en als ik 2 kolommen weglaat uit de query:

beigntijd:19:01:37
eindtijd: 19:04:44, 100 records

___
kleinetabel1
18:53:21
18:53:25, 51600 reocrds opgevraagd

kleinetabel2
18:53:25
18:53:26, 6100 records opgevraagd

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Het lijkt me handig als je een keertje iets gaat lezen over het joinen van tabellen ;) .

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Inderdaad: joinen werkt sneller, heb ik al uitgeprobeerd

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 22-06 15:30
ALTER TABLE grotetabel ADD INDEX indexnaam (column1, column2);

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Verwijderd

Op dinsdag 05 maart 2002 18:30 schreef jchris het volgende:

...

begintijd: 182001

61 records als resultaat

eindtijd: 182331


grotetabel: 100000 records in totaal
kleinetabel1: 8500 records in totaal
kleinetabel2: 500 records in totaal
bah... je bent ze nog aan het nesten ook.
Doe eens een join. Kijk eens op welke velden je een WHERE doet en leg daar eens een index op.
Pagina: 1