Snelste MySQL query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Zero Dead

Zero Dead

04/07/2006 13:22:00
Quote Anchor link
Ik ben nu al een tijdje bezig met PHP & MySQL, en zet zoveel mogelijkm dingen in het WHERE-stukje van een query om de selectie zo snel mogelijk te maken.

Maar nu weet ik niet zeker OF dat wel het snelste is.

Voorbeeld:
Tabel users
id int auto_increment PRIMARY
gebruikersnaam varchar UNIQUE
wachtwoord varchar
email varchar
actief enum('0', '1') (<-- is TINYINT beter?)
ToS enum('0', '1') " "
nieuwsbrief enum('0', '1') " "
extra_informatie text

Nu heb ik de volgende query:
UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `id`='1'

Hoe maak ik die nou het snelste?

Ik heb de volgende keuzes:
1. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `id`='1'
2. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `actief`='1' AND `tos`='1' AND `nieuwsbrief`='1' AND `id`='1'
3. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `nieuwsbrief`='1' AND `tos`='1' AND `actief`='1' AND `id`='1'
4. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `id`='1' AMD `nieuwsbrief`='1' AND `tos`='1' AND `actief`='1'

Een 2de query:

UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `gebruikersnaam`='ZeRoDeaD' (ik weet het id niet)

En de volgende keuzes:
1. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `gebruikersnaam`='ZeRoDeaD'
2. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `actief`='1' AND `tos`='1' AND `gebruikersnaam`='ZeRoDeaD'
3. UPDATE `users` SET `wachtwoord`='PHPhulp' WHERE `gebruikersnaam`='ZeRoDeaD' AND `tos`='1' AND `actief`='1'

Bij beide query's tellen de volgende regels:
id altijd anders
gebruikersnaam altijd anders
wachtwoord meestal anders
email meestal anders
actief 99/100 keer is het 1
ToS 80/100 keer is het 1
nieuwsbrief 40/100 keer is het 1
extra_informatie optioneel, meestal leeg

-Edit-
Ik denk dat de query die het minste per WHERE 'opdracht' wegstreept het snelste is OF de WHERE-query waar alleen `id`='1' instaat.
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
 
PHP hulp

PHP hulp

14/12/2019 11:10:47
 
Erik Rijk
Moderator

Erik Rijk

04/07/2006 13:24:00
Quote Anchor link
ik denk dat het 0,00001 seconde uit maakt.
 
Zero Dead

Zero Dead

04/07/2006 13:27:00
Quote Anchor link
Niet wanneer je een query hebt die 1 rij tussen de 200,000 rijen moet selecteren...

In een tabel van bijv. 5 MB kan dit ook een hele tijd schelen!
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
 
Eris -

Eris -

04/07/2006 13:35:00
Quote Anchor link
gewoon testen

daarnaast hoor je ` te vergeten / niet te gebruiken...
 
- wes  -

- wes -

04/07/2006 13:35:00
Quote Anchor link
5mb is niets voor een tabel
pas vanaf gb tabellen of iig 500mb+ ga je het echt goed merken
 
Zero Dead

Zero Dead

04/07/2006 13:41:00
Quote Anchor link
@ Eris; maar zolang ik MySQL gebruik vind ik ` net zo netjes, is wat overzichtelijker.

En als ik bijv. een query gebruik als:
UPDATE user_messages SET read='1' WHERE to='{$_SESSION['login']}'

Dan loopt hij volgens mij vast zodra hij het woordje 'to' ziet.(heb ik eerder al eens gehad)
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
 
Eris -

Eris -

04/07/2006 13:42:00
Quote Anchor link
to is een reserved geval. Die moet je dus ook niet gebruiken...
 
Bo az

Bo az

04/07/2006 13:43:00
Quote Anchor link
Dat komt omdat TO een reserved word is:
http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

Die hoor je dus uberhaupt niet te gebruiken.
 
Zero Dead

Zero Dead

04/07/2006 13:45:00
Quote Anchor link
@ Wes; een 'groot'/'zwaar' script met veel query's erin(bijv. persoonlijke statistieken of een profiel) kan het behoorlijk lang duren om alle query's uit te voeren.

En om op mijn eigen server te testen heeft ook geen zin, die word continue gebruikt...

Hits per Hour: AVG; 24758 MAX; 57446 Dat is per minuut AVG: 412 MAX: 957 -> per seconde: AVG: 6.87 MAX: 15.96
 
- wes  -

- wes -

04/07/2006 14:14:00
Quote Anchor link
@zerodead

ik snap wel wat je bedoeld maar dat was je vraag niet :)

Heb zelf ook

klanten
adsl
adsl_invoice
tarieven
data
email

en dan nog 5 databases, waar ik in 1 query een overzicht van moet krijgen á 5000 stuks, duurd een goede 0,2 seconden , dankzij mn indeling . tkan wel snel maar je moet wel een beetje van de hoed en de rand weten
 
Snotty

snotty

04/07/2006 14:44:00
Quote Anchor link
Als je echt de snelste query wilt, kan je het steeds testen met een functie zoals microtime(). Waarmee je de page-generation-time kan berekenen. Dan kan je de laagste tijd nemen.
 
- wes  -

- wes -

04/07/2006 14:46:00
Quote Anchor link
slaat nergens op, das leuk voor je output, maar je databasemodel kan je daar niet doorheen gooien
 
Snotty

snotty

04/07/2006 14:48:00
Quote Anchor link
Dat veranderd uiteraard niets aan je databasemodel maar je kan daarmee toch wel weten wat de snelste QUERY is (en dus niet het snelste databasemodel)?
 
- wes  -

- wes -

04/07/2006 15:26:00
Quote Anchor link
je snelheid ligt meer aan je databasemodel en opmaak dan je query op een zeker punt
 
Snotty

snotty

04/07/2006 15:38:00
Quote Anchor link
Ja, dat weet ik, maar ik dacht dat hij in zijn topicstart vroeg naar de snelste query. Vandaar dat ik die oplossing geef :).
 
Frank -

Frank -

04/07/2006 18:01:00
Quote Anchor link
Quote:
@ Eris; maar zolang ik MySQL gebruik vind ik ` net zo netjes, is wat overzichtelijker.
Er is helemaal niets 'netjes' te vinden aan slecht SQL-gebruik. Je leert verkeerde dingen aan, zoals het gebruik van gereserveerde woorden voor tabel- en kolomnamen.

Beschouw die smerige backtics als een stuk afval, dat wil je echt niet in je SQL hebben.

Netje SQL schrijven kun je alsvolgt doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
UPDATE
  users
SET
  wachtwoord = 'PHPhulp'
WHERE
  id = 1

Op deze manier springen de tabel- en kolomnamen er ook uit. De waarde 1 is een integer, deze hoort dus eigenlijk niet tussen quotes te staan.

Verder wordt de snelheid van een query voor een belangrijk deel bepaald door de gebruikte indexen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.