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

Czy lepiej filtrować zestaw wyników za pomocą klauzuli WHERE, czy za pomocą kodu aplikacji?

Zasadą dla każdej aplikacji jest umożliwienie DB robienia rzeczy, które robi dobrze:filtrowania, sortowania i łączenia.

Rozdziel zapytania na ich własne funkcje lub metody klasowe:

$men = $foo->fetchMaleUsers();
$women = $foo->fetchFemaleUsers();

Aktualizacja

Wziąłem demonstrację PostgreSQL Stevena pełnego zapytania skanującego tabelę, które działa dwa razy lepiej niż dwa oddzielne indeksowane zapytania i naśladowałem je za pomocą MySQL (który jest używany w rzeczywistym pytaniu):

Schemat

CREATE TABLE `gender_test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `gender` enum('male','female') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26017396 DEFAULT CHARSET=utf8

Zmieniłem typ płci, aby nie był VARCHAR(20), ponieważ jest to bardziej realistyczne do celów tej kolumny, dostarczam również klucz podstawowy, jak można się spodziewać w tabeli, zamiast arbitralnej wartości PODWÓJNEJ.

Nieindeksowane wyniki

mysql> select sql_no_cache * from gender_test WHERE gender = 'male';

12995993 rows in set (31.72 sec)

mysql> select sql_no_cache * from gender_test WHERE gender = 'female';

13004007 rows in set (31.52 sec)

mysql> select sql_no_cache * from gender_test;

26000000 rows in set (32.95 sec)

Ufam, że to nie wymaga wyjaśnienia.

Zindeksowane wyniki

ALTER TABLE gender_test ADD INDEX (gender);

...

mysql> select sql_no_cache * from gender_test WHERE gender = 'male';

12995993 rows in set (15.97 sec)

mysql> select sql_no_cache * from gender_test WHERE gender = 'female';

13004007 rows in set (15.65 sec)

mysql> select sql_no_cache * from gender_test;

26000000 rows in set (27.80 sec)

Przedstawione tutaj wyniki są radykalnie różni się od danych Stevena. Zindeksowane zapytania wykonują prawie dwa razy szybciej niż skanowanie całej tabeli. Pochodzi z właściwie zindeksowanej tabeli przy użyciu zdroworozsądkowych definicji kolumn. W ogóle nie znam PostgreSQL, ale musi być jakaś znacząca błędna konfiguracja w przykładzie Stevena, aby nie pokazać podobnych wyników.

Biorąc pod uwagę reputację PostgreSQL, która robi rzeczy lepiej niż MySQL, a przynajmniej tak dobrze, śmiem twierdzić, że PostgreSql wykazywałby podobną wydajność, gdyby był właściwie używany.

Zauważ też, że na tej samej maszynie zbyt uproszczona pętla for wykonująca 52 miliony porównań zajmuje dodatkowe 7,3 sekundy do wykonania.

<?php
$N = 52000000;
for($i = 0; $i < $N; $i++) {
    if (true == true) {
    }
}

Myślę, że biorąc pod uwagę te dane, jest dość oczywiste, jakie jest lepsze podejście.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:UNIQUE, ale DEFAULT NULL - dozwolone przez utworzenie tabeli. Można wstawić więcej niż 1 NULL. Czemu?

  2. Flask-SQLAlchemy sprawdza, czy serwer bazy danych reaguje

  3. Szablon Spring JDBC — jak pobrać wiele wyników z wieloma parametrami za pomocą jednego zapytania

  4. Jak połączyć się z mysql z php?

  5. Parametry połączenia ODBC 5.1 dla MySQL z dostępem tylko do odczytu