Który kod jest bardziej wydajny?

Odpowiedz Nowy wątek
2019-10-28 15:27
0

Witam, Który kod jest bardziej wydajny oraz jaka jest różnica między tymi dwoma az tak duza?

sposób 1 (mój)

$ChatMessages = $Connect_Server->prepare('SELECT * FROM chat DESC ASC LIMIT 100');
$ChatMessages->execute();

foreach($ChatMessages as $ChatMessage) {
$accounts = $Connect_Server->prepare('SELECT * FROM accounts WHERE id = :account_id LIMIT 1');
$accounts->bindValue(':account_id', $ChatMessage['account_id'], PDO::PARAM_INT);
$accounts->execute();

foreach($accounts as $account){

}
$accounts->closeCursor();
}
$ChatMessages->closeCursor();`

sposób 2 (kolegi)

    $QueryGetMessages = $Connect_Server->query('SELECT accounts.user_name, accounts.ranga, accounts.color_name, accounts.color_message, accounts.effect_name, accounts.effect_message, accounts.gender, accounts.avatar, chat.text, chat.create_date FROM accounts INNER JOIN chat ON accounts.id = chat.account_id ORDER BY create_date DESC');
    $Messages = $QueryGetMessages->fetchAll(PDO::FETCH_ASSOC);
    $Messages = array_reverse($Messages);
edytowany 1x, ostatnio: Programistyczny, 2019-10-28 15:29

Pozostało 580 znaków

2019-11-05 19:42
1

Tak, w tym przypadku (i w większości innych) to zapytanie do bazy będzie dużo wydajniejsze.
W zależności od tego co potrzebujesz, masz kilka typów JOINów (najczęściej używa się LEFT/RIGHT/INNER, ale jest ich jeszcze kilka). INNER JOIN w mysql jest używany domyślnie po użyciu samego słowa "JOIN".
fetchall - https://www.php.net/manual/en/pdostatement.fetchall.php
query - https://www.php.net/manual/en/pdo.query.php
tak więc nie, nie musisz tego używać.
Jeżeli nie musisz bindować parametrów i masz pewność, że wszystkie dane są poprawnie oczyszczone, to możesz użyć query. Gdy parametry pochodzą od użytkownika, użyłbym prepare i execute, chyba że lubisz życie na krawędzi. Ogólnie dla bezpieczeństwa, używałbym zawsze prepare + execute.

Po co nawias? Możesz łatwo rodzielić kod SQL enterami np.

"
SELECT player.id,player.level,player.name,account_id 
FROM player
INNER JOIN account.account ON account.id = player.account_id 
INNER JOIN common.gmlist ON gmlist.mAccount = account.login 
WHERE status = 'OK' 
ORDER BY level DESC,exp DESC 
LIMIT 10
"

Zresztą nawiasy są przede wszystkim używane do SUBQUERY.

Edit:
Nie wiem czy to było zamierzone, ale zauważyłem dopiero teraz:

INNER JOIN common.gmlist ON gmlist.mAccount  != account.login 

Co miałeś na myśli wstawiając do zapytania != ?

edytowany 2x, ostatnio: mefsh, 2019-11-05 19:51

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0