Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Jakie zapytanie jest szybsze?, nie wiem którego używać
ktosz
post 22.10.2015, 10:19:44
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
viking
post 22.10.2015, 10:22:03
Post #2





Grupa: Zarejestrowani
Postów: 6 377
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 22.10.2015, 10:29:40
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 22.10.2015, 10:36:47
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 22.10.2015, 10:38:06
Post #5





Grupa: Zarejestrowani
Postów: 6 377
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 22.10.2015, 11:12:05
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 22.10.2015, 11:50:31
Post #7





Grupa: Zarejestrowani
Postów: 6 377
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 22.10.2015, 11:56:44
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 22.10.2015, 12:07:00
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 22.10.2015, 12:10:02
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 23.10.2015, 17:47:29
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. 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 23.10.2015, 18:18:24
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 23.10.2015, 21:14:17
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 13:04