Permalänk
Medlem

fråga om hastighet[mysql]

Hallå.

Tänkte höra mig för vad det gäller hastigheter i sql frågor och hur stor betydelse vissa saker har.

Om jag för exempel har en tabell med tre kolumner. Id, produktId, kategoriId

Om jag vill se hur många produkter som det finns i en kategori. Gör det då någon skillnad som jag använder * som select-parameter eller om jag preciserar med produktId, kategoriId. dvs

select * from ...
eller select produktId, kategoriId from?

Det gör ju självklart ingen skillnad om man bara har några få rader. Men om det kommer flera tusen eller flera miljoner...hur är det då?

TPF

Visa signatur

Jag hatar att vara förkyld!

Permalänk
Medlem

* tar aningen mer tid, dock obetydligt lite i bara text/nummer-fält
hade det däremot varit blob-fält med binärdata säg runt 10 MB i varje så vill du nog inte ta med fältet om du bara vill ha t.ex. ID och Title

men på en produkt-lista, nej det spelar ingen roll
om du nu inte skulle komma upp i ca 1 miljon produkter

Visa signatur

i7-4770K @ 3.5GHz - 32GB RAM - 2x 500GB SSD - 40TB HDD - GTX770

Permalänk
Testpilot

Ska du bara räkna antal rader är det betydligt bättre att använda count som finns i MySQL:

SELECT COUNT(*) FROM tabell WHERE cat=2

Att selecta alla och köra mysql_num_rows på det är inte att rekomendera.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Samt att det underlättar om du använder dig av fält,fält,fält istället för * när du väl skall hämta ut data

Visa signatur

//Pochen

Permalänk
Medlem

Det mesta har redan sagts i tråden. Men jag brukar alltid specifikt ange vilka kolumner som skall hämtas. Även om det vid tillfället är alla kolumner som finns i tabellen så anger jag dessa. Detta eftersom man senare kan komma att lägga till fler kolumner! Då vill man inte rota runt bland en massa SQL-frågor i olika filer för att ändra på vilka kolumner som egentligen skall hämtas. Det tar bara onödig tid. Gör rätt från början istället, så slipper du krångel senare.

Alltså, min åsikt är den att man i princip aldrig skall använda *, för man vet inte om man senare kommer att lägga till andra kolumner.

Permalänk
Medlem

Jag säger motsatsen mot DeeXt (eller vad han säger, jag läser det som att han talar emot sig själv).

Om man ska hämta alla, eller ungefär alla fält så tycker jag att * är att föredra - för man kanske lägger till fler fält sen, eller gör om saker, så då vill man inte rota runt bland en massa SQL - frågor för att se vad som egentligen ska hämtas. (stal resonemanget av DeeXt) ;).

Ett exempel jag har, t.ex. "ändra användarinställningar" för ett community. Jag drar väl ned då ungefär 50-60 fält och det är väldigt smidigt att alltid veta att man har veranda fält som finns med i raden - oavsett vilken version databasen har.

Alla mina "ändra whatever (person, forumstråd, objekt, kund, annons, forumsinlägg, i all evighet)" hämtar alltid * för att vara extremt smidiga att arbeta med.

Men för vanligt behov ska man absolut inte använda * för att hämta bara en liten del av datan. Även om det knappt har märkbara effekter på en liten app så är det aldrig bra att vänja sig med attt skriva skitkod bara för att det inte gör något.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av totoo
Jag säger motsatsen mot DeeXt (eller vad han säger, jag läser det som att han talar emot sig själv).

Om man ska hämta alla, eller ungefär alla fält så tycker jag att * är att föredra - för man kanske lägger till fler fält sen, eller gör om saker, så då vill man inte rota runt bland en massa SQL - frågor för att se vad som egentligen ska hämtas. (stal resonemanget av DeeXt) ;).

Ett exempel jag har, t.ex. "ändra användarinställningar" för ett community. Jag drar väl ned då ungefär 50-60 fält och det är väldigt smidigt att alltid veta att man har veranda fält som finns med i raden - oavsett vilken version databasen har.

Alla mina "ändra whatever (person, forumstråd, objekt, kund, annons, forumsinlägg, i all evighet)" hämtar alltid * för att vara extremt smidiga att arbeta med.

Men för vanligt behov ska man absolut inte använda * för att hämta bara en liten del av datan. Även om det knappt har märkbara effekter på en liten app så är det aldrig bra att vänja sig med attt skriva skitkod bara för att det inte gör något.

Tala emot mig själv vet jag inte. Enligt min erfarenhet har det varit bättre att specifikt ange vilka kolumner det är som skall hämtas även om det är alla vid det läget. Det är inte alls säkert att man vill hämta den nya kolumnen om man lägger till en sådan.

Låt ta ditt exempel, du måste väl ändå lägga in ny kod (inputfält osv) för kolumnen med nya egenskapen? Eller sköter du det per automatik? Om inte, då måste du ju ändå gå ner i filen och pilla. Att sedan vara tvungen att lägga till en kolumn är ju inte särskilt mycket arbete.

Nåväl, jag hämtar aldrig alla kolumner. Det är alltid någon kolumn man inte behöver.

Permalänk
Medlem

En nackdel med att plocka ut * är att det blir svårt att hitta alla ställen i koden där ett visst fält används. Annars är det ju ganska enkelt att söka efter kolumnnamnet i alla filer.