Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Jakie zapytanie jest szybsze?, nie wiem którego używać
ktosz
post
Post #1





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 27.01.2009
Skąd: Warszawa, Mazowieckie

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował ktosz 22.10.2015, 10:19:54
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zapewne drugie ale dlaczego sam nie sprawdzisz?
Go to the top of the page
+Quote Post
ktosz
post
Post #3





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 27.01.2009
Skąd: Warszawa, Mazowieckie

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Jest szybszy sposób. Nie traktuj liczb jako stringi. Porównywanie stringów zajmuje dużo więcej czasu.
Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Ja bym się raczej przejmował że:
- używasz przestarzałego rozszerzenia mysql_
- ukrywasz błędy @
Go to the top of the page
+Quote Post
ktosz
post
Post #6





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 27.01.2009
Skąd: Warszawa, Mazowieckie

Ostrzeżenie: (0%)
-----


Dobrze, małpki@ mam usunięte, a jakie sugierujesz zapytanie zamiast tego? będzie szybsze? ja się wychowałem na takim, innego nie znam.
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
redeemer
post
Post #8





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. $id = mysql_real_escape_string(intval($_GET['id']));
  2. $sql = "SELECT * FROM table WHERE id = {$id}";
Go to the top of the page
+Quote Post
redeemer
post
Post #10





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
KsaR
post
Post #11





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


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. (IMG:style_emoticons/default/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).

Ten post edytował KsaR 23.10.2015, 17:49:18
Go to the top of the page
+Quote Post
redeemer
post
Post #12





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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 :-)
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 13:42