Controleer of iets in de database voor komt

Status
Niet open voor verdere reacties.

martijn12321

Gebruiker
Lid geworden
14 nov 2011
Berichten
827
Hallo,

Wat is de meest efficiënte manier om te controleren of een bepaalde combi (in dit geval activatie code en een user id) samen voor komen in de database?
Ik kan natuurlijk dit doen:
Code:
SELECT * FROM table WHERE code='$code' AND UserID='$uid'
(en daarna mysqli_num_rows)
Maar ik hoef helemaal niks uit de tabel terug te krijgen dus dit is eigenlijk gewoon zonde van de data, zelfs als ik ipv * bijv UserID neerzet.
Wat is de meest effeciënte manier om dit te doen?
Ik gebruik PHP

Heel erg bedankt!!!
 
Het meest efficient is SELECT NULL, omdat de database dan het record niet op hoeft te zoeken om een veld eruit te halen (voor zover dat al gebeurd als je een veld uit de index selecteert)

Maar het hangt er ook vanaf waarom je wilt weten of de code voorkomt, and als je b.v. daarna een nieuw record gaat toevoegen in een ander tabel dan kun je de twee combineren en meteen ook raceconditions voorkomen.
 
Het is voor een wachtwoord reset systeem.
Als de combi klopt, moet er idd nieuwe data in de user tabel (de combi staat in pwreset). Zou je een voorbeeld code kunnen geven?
Heel erg bedankt voor je hulp!
 
Een wachtwoord reset gebeurt maar eens in de zoveel keer, dus om hier extreem te optimaliseren is een beetje overdreven.

Waar je wel op moet letten zijn de race-conditions; Wanneer je een code opzoekt om hem te gebruiken voor een nieuw wachtwoord mag de code ook tijdens die handeling niet worden gebruikt door een ander proces.
Dit kun je doen met transactions en SELECT FOR UPDATE. De select-for-update haalt de code op en lockt het record zodat alleen jij het kunt aanpassen. Daarna kun je het wachtwoord aanpassen/invoeren en als dat gelukt is kun je de code aanmerken als "gebruikt" en de transactie committen.

Komt er tegelikjkertijd een ander process dat dezelfde code wil selecteren dan kan dat niet vanaf het moment dat het eerste proces de code heeft gelockt, en wanneer het lock wordt vrijgegeven voldoet het record al niet meer aan je where clausule.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan