MySQL: 20 najlepszych praktyk
Bardzo przystępnie i czytelnie wyjaśnione jak pisać wydajne zapytania, wraz z obrazowymi przykładami.
ireks z- #
- #
- #
- #
- #
- #
- #
- #
- #
- 41
Bardzo przystępnie i czytelnie wyjaśnione jak pisać wydajne zapytania, wraz z obrazowymi przykładami.
ireks z
Komentarze (41)
najlepsze
Jak zaprojektować bazę w sqlite3, żeby móc przechowywać wyjściowe dane z kolejnych iteracji algorytmu? Powiedzmy mam 100000 (ta liczba może ulec zmianie) struktur z polami: float x, float y, float fitness (może jeszcze będę chciał zapisać: float xlb, float ylb, float fitnesslb). Dane są przetwarzane równolegle i dostępne w jednej chwili, więc trzeba je wszystkie naraz zapisać.
Obecnie mam taką: CREATE
Jeśli chodzi o indeksy - każdy indeks spowalnia INSERT ale tabela bez Primary Key to zbrodnia. Tak więc utwórz tylko PK, żadnego innego (o ile jest tak jak mówisz - nie wyciągasz zbyt często tych danych).
Staraj się upakować jak najwięcej INSERTów do jednej transakcji, nie COMMITuj przy każdym INSERTcie.
Nie zaszkodzi również podwyższyć PRAGMA
Jak już to:
SELECT * FROM buraczki WHERE dziewica IS NOT NULL AND dataurodzenia BETWEEN( DATESUB(dataurodzenia, INTERVAL 28 YEAR), DATESUB(data_urodzenia, INTERVAL 18 YEAR))
var buraczek=(from p in db.Buraczki where p.DataUrodzenia==Datetime.Now.AddYears(-25) select p).Single();
try { System.FedEx.Send(buraczek); }
catch { System.UPS.Send(buraczek); }
finally { db.SubmitChanges(); }
WHERE id = 1 and pass = SHA1('cos');
bedzie duzo szybsze niz
WHERE pass = SHA1('cos') and id = 1;
Dotyczy to nie tylko WHERE, optymalizator może nawet zmienić FROM t1 INNER JOIN t2 na FROM t2 INNER JOIN t1, jak wyjdzie że to jest szybsze.
Jezeli w WHERE mamy warunki rozdzielone za pomoca AND to warunek najmniej prawdopodobny dajemy jako pierwszy (jezeli jego wartosc jest falsz to cale wyrazenie traktowane jest jako falsz bez sprawdzania drugiego warunku)
Jezeli w WHERE mamy warunki rozdzielone OR to warunek najbardziej prawdopodobny dajemy jako pierwszy (jezeli jego wartosc jest true to cale wyrazenie traktowane jest
Ale ale premature optimization is the root of all evil
Jak sama nazwa wskazuje to nic nie da przecież skoro kolumny w WHERE są unikalne :))
Poza tym lepiej jest robić
if ($w = @mysql_fetch_row($q)) {
...
niż
if (mysqlnumrows($q) > 0) {
$w = @mysql_fetch_row($q)
...
poza tym jak już pisać to rzetelnie czyli:
if (**mysqlnumrows($q) == 1**){
$w = @mysql_fetch_row($q)
...
Poza tym parę punktów
"if ($w = @mysqlfetchrow($q)) niż if (mysqlnumrows($q) > 0) "
Jak widzisz autor sprawdza czy w ogóle jest taki rekord, a nie chce wyciągnąć z niego danych (SELECT 1) więc po co w przekazywać rekord z