Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Jakie zapytanie jest szybsze?
Forum PHP.pl > Forum > Przedszkole
ktosz
Cześć mam pytanie odnośnie zapytania sql, chodzi mi o to, które jest sprawniejsze i bardziej wydajne. Chce zliczać sobie ilość rekordów w jakimś tam warunku np:

  1. $sprawdz = @mysql_num_rows(mysql_query("SELECT `id` FROM `uzytkownicy` WHERE `strona`='1' AND `kiedy`='1'"));
czy
  1. $sprawdz = @mysql_result(mysql_query("SELECT COUNT(id) FROM `uzytkownicy` WHERE `strona`='1' AND `kiedy`='1'"), 0);


co jest wydajniejsze by to zliczyć?
viking
Zapewne drugie ale dlaczego sam nie sprawdzisz?
ktosz
Nie odczuwam różnicy pomiędzy tym i tym ogólnie, ale chciałem się dowiedzieć. Jeśli drugie to ok, dziękuję bardzo za pomoc. A szybszej opcji już nie ma?
mmmmmmm
Jest szybszy sposób. Nie traktuj liczb jako stringi. Porównywanie stringów zajmuje dużo więcej czasu.
viking
Ja bym się raczej przejmował że:
- używasz przestarzałego rozszerzenia mysql_
- ukrywasz błędy @
ktosz
Dobrze, małpki@ mam usunięte, a jakie sugierujesz zapytanie zamiast tego? będzie szybsze? ja się wychowałem na takim, innego nie znam.
viking
http://php.net/manual/en/book.pdo.php

@mmmmmmm chodziło o to że masz w tabeli wyraźnie int a traktujesz je jak stringi. kiedy = 1 po prostu.
Sprawdziłem przed chwilą że takie zapytanie wykorzystuje również indeksy więc jeśli nie masz to ich dodanie równiez pomoże.

https://dev.mysql.com/doc/refman/5.0/en/explain.html

A poza tym są ważniejsze rzeczy do optymalizacji zazwyczaj.
redeemer
Cytat(viking @ 22.10.2015, 12:50:31 ) *
...
@mmmmmmm chodziło o to że masz w tabeli wyraźnie int a traktujesz je jak stringi. kiedy = 1 po prostu.
...
Dla bazy to nie ma znaczenia, natomiast z punktu widzenia bezpieczeństwa ma.

Dla porównania, mamy 2 kody:
  1. $id = mysql_real_escape_string($_GET['id']);
  2. $sql = "SELECT * FROM table WHERE id = '{$id}'";
  1. $id = mysql_real_escape_string($_GET['id']);
  2. $sql = "SELECT * FROM table WHERE id = {$id}";
W drugim wypadku mimo zastosowania mysql_real_escape_string, możliwe jest przeprowadzenie ataku typu SQL injection.
mmmmmmm
  1. $id = mysql_real_escape_string(intval($_GET['id']));
  2. $sql = "SELECT * FROM table WHERE id = {$id}";
redeemer
Cytat(mmmmmmm @ 22.10.2015, 13:07:00 ) *
  1. $id = mysql_real_escape_string(intval($_GET['id']));
  2. $sql = "SELECT * FROM table WHERE id = {$id}";
Wystarczy $id = (int)$_GET['id']; ale chodziło mi o pokazanie że, nie warto pozbywać się apostrofów nawet dla wartości liczbowych.
KsaR
Cytat(mmmmmmm @ 22.10.2015, 13:07:00 ) *
  1. $id = mysql_real_escape_string(intval($_GET['id']));
  2. $sql = "SELECT * FROM table WHERE id = {$id}";

Tak z ciekawości, (jako ze ja uzywalem tylko PDO od poczatku, nigdy mysql_ czy mysqli_)
Po co mysql_real_(...) skoro jest intval czyli bedzie cyfra? Sa jakies wyjątki? (Pytam bo jednak duzo gotowych skryptow korzysta z tych mysql_* to wrazie czego dobrze wiedziec)
--
@redeemer - ciekawe co do tego SQL Injection. tongue.gif
--
Wracajac do tematu, Moim zdaniem takze drugie szybsze powinno być. Z tego powodu że baza szybciej zlicza od php, przez co odrazu wysyla do php wynik gotowy. (Jednak nie znam konkretnego dzialania mysql_num_rows to moge sie mylic).
redeemer
Cytat(KsaR @ 23.10.2015, 18:47:29 ) *
Tak z ciekawości, (jako ze ja uzywalem tylko PDO od poczatku, nigdy mysql_ czy mysqli_)
Po co mysql_real_(...) skoro jest intval czyli bedzie cyfra? Sa jakies wyjątki? (Pytam bo jednak duzo gotowych skryptow korzysta z tych mysql_* to wrazie czego dobrze wiedziec)
Np. do zwykłych stringów. W PDO masz to załatwione z automatu (o ile bindujesz parametry, a nie wstawiasz je prosto w zapytanie sql - bo takie cuda też się zdarzają). mysql_real_escape_string tak naprawdę wywołuje natywną funkcje w Mysql C API (https://dev.mysql.com/doc/refman/5.1/en/mysql-real-escape-string.html), która generalnie dodaje backslash do takich znaków jak \x00 (nullbyte), \n, \r \, ', " i \x1a, czyli niemożliwa jest "ucieczka" jeśli wartość jest w apostrofach. A temat addslashes vs mysql_real_escape_string to na inny wątek :-)
mmmmmmm
Cytat(KsaR @ 23.10.2015, 18:47:29 ) *
Tak z ciekawości, (jako ze ja uzywalem tylko PDO od poczatku, nigdy mysql_ czy mysqli_)
Po co mysql_real_(...) skoro jest intval czyli bedzie cyfra? Sa jakies wyjątki? (Pytam bo jednak duzo gotowych skryptow korzysta z tych mysql_* to wrazie czego dobrze wiedziec)

Bo mi się usuwać nie chciało...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.