sql >> Database >  >> RDS >> Mysql

Is het beter om een ​​resultatenset te filteren met een WHERE-clausule of met toepassingscode?

De vuistregel voor elke toepassing is om de database de dingen te laten doen die het goed doet:filteren, sorteren en samenvoegen.

Scheid de zoekopdrachten in hun eigen functies of klassemethoden:

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

Bijwerken

Ik nam Steven's PostgreSQL-demonstratie van een volledige tabelscanquery die twee keer zo goed presteert als twee afzonderlijke geïndexeerde query's en deed deze na met MySQL (die in de eigenlijke vraag wordt gebruikt):

Schema

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

Ik heb het geslachtstype gewijzigd om geen VARCHAR (20) te zijn, omdat dit realistischer is voor het doel van deze kolom. Ik geef ook een primaire sleutel zoals je zou verwachten op een tabel in plaats van een willekeurige DOUBLE-waarde.

Niet-geïndexeerde resultaten

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)

Ik vertrouw erop dat dit geen uitleg behoeft.

Geïndexeerde resultaten

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)

De hier getoonde resultaten zijn radicaal verschillend van de gegevens van Steven. De geïndexeerde zoekopdrachten presteren bijna twee keer zo snel als de volledige tafelscan. Dit komt uit een correct geïndexeerde tabel met behulp van gezond verstand kolomdefinities. Ik ken PostgreSQL helemaal niet, maar er moet een significante verkeerde configuratie zijn in het voorbeeld van Steven om geen vergelijkbare resultaten te tonen.

Gezien de reputatie van PostgreSQL om dingen beter te doen dan MySQL, of op zijn minst zo goed als, durf ik te zeggen dat PostgreSql vergelijkbare prestaties zou laten zien als het op de juiste manier wordt gebruikt.

Merk ook op dat op dezelfde machine een overdreven vereenvoudigde for-lus die 52 miljoen vergelijkingen doet, extra 7,3 seconden kost om uit te voeren.

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

Ik denk dat het vrij duidelijk is wat de beste aanpak is gezien deze gegevens.



  1. N rijen selecteren in SQL Server

  2. De eigenschap V$SESSION.program instellen op Glassfish JDBC Connection Pool

  3. Hardwaretrends voor databaseservers

  4. MySQL met Symfony2