Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Powody, dla których nie warto używać GROUP_CONCAT?

  • Użycie GROUP_CONCAT() zwykle wywołuje logikę grupowania i tworzy tabele tymczasowe, które zwykle mają duży negatywny wpływ na wydajność. Czasami możesz dodać właściwy indeks, aby uniknąć tabeli tymczasowej w zapytaniu grupującym, ale nie w każdym przypadku.

  • Jak wskazuje @MarcB, domyślny limit długości łańcucha połączonego z grupą jest dość krótki i wiele osób zostało zdezorientowanych przez obcięte listy. Możesz zwiększyć limit za pomocą group_concat_max_len .

  • Eksploatacja ciągu w tablicę w PHP nie jest darmowa. Tylko dlatego, że możesz to zrobić w jednym wywołaniu funkcji w PHP, nie oznacza to, że jest to najlepsze dla wydajności. Nie porównałem różnicy, ale wątpię, czy ty też.

  • GROUP_CONCAT() to MySQLism. Nie jest szeroko obsługiwany przez inne produkty SQL. W niektórych przypadkach (np. SQLite) mają funkcję GROUP_CONCAT(), ale nie działa ona dokładnie tak samo jak w MySQL, więc może to prowadzić do mylących błędów, jeśli musisz obsługiwać wiele zapleczy RDBMS. Oczywiście, jeśli nie musisz się martwić o przeniesienie, to nie jest problem.

  • Jeśli chcesz pobrać wiele kolumn ze swoich currencies tabeli, potrzebujesz wielu wyrażeń GROUP_CONCAT(). Czy gwarantuje się, że listy będą ułożone w tej samej kolejności? To znaczy, czy trzecie pole na jednej liście odpowiada trzeciemu polu na następnej liście? Odpowiedź brzmi:nie – nie, chyba że określisz kolejność za pomocą ORDER BY klauzula wewnątrz GROUP_CONCAT().

Zwykle preferuję twój pierwszy format kodu, używam konwencjonalnego zestawu wyników i przeglądam wyniki w pętli, zapisując do nowej tablicy indeksowanej przez identyfikator klienta, dołączając waluty do tablicy. Jest to proste rozwiązanie, które sprawia, że ​​SQL jest prosty i łatwiejszy w optymalizacji oraz działa lepiej, jeśli masz wiele kolumn do pobrania.

Nie próbuję powiedzieć, że GROUP_CONCAT() jest zła! W wielu przypadkach jest to naprawdę przydatne. Ale próba stworzenia jednej uniwersalnej reguły, aby używać (lub unikać) dowolnej funkcji lub funkcji językowej, jest uproszczona.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy timestampdiff() w MySQL jest odpowiednikiem datediff() w SQL Server?

  2. Przykłady ASCII() – MySQL

  3. Błąd uruchamiania MySQL — brak elementu głównego

  4. Wybierz wartość z określonej tabeli z klauzulą ​​`gdzie` w innej tabeli

  5. Jak korzystać z metody password_hash() w php..?