sql >> Database >  >> RDS >> Mysql

geheugengebruik exporteren van database naar csv in php

Alleen de twee tabellen gebruiken:

Uw oorspronkelijke vraag:

SELECT subscribers.email_address, 
       subscribers.first_name, 
       subscribers.last_name, 
       t1.value AS Languages 
  FROM subscribers 
  LEFT JOIN (SELECT subscriber_id, 
                    field_id, 
                    GROUP_CONCAT(value SEPARATOR '|') AS value 
               FROM subscribers_multivalued 
              WHERE field_id=37 
              GROUP BY subscriber_id, field_id
            ) AS t1 
         ON subscribers.subscriber_id=t1.subscriber_id 
        AND t1.field_id=37 
 WHERE (list_id=49) 
   AND (state=1)

geeft een uitlegplan van:

id  select_type  table                    type  possible_keys  key         key_len  ref    rows  Extra
1   PRIMARY      subscribers              ref   FK_list_id     FK_list_id  4        const  2     Using where
1   PRIMARY      <derived2>               ALL   NULL           NULL        NULL     NULL   5      
2   DERIVED      subscribers_multivalued  ALL   field_fk       field_fk    4               11    Using filesort

Mijn suggestie om mee te doen:

SELECT subscribers.email_address, 
       subscribers.first_name, 
       subscribers.last_name, 
       GROUP_CONCAT(t1.value SEPARATOR '|') AS Languages 
  FROM subscribers 
  LEFT JOIN subscribers_multivalued t1 
         ON subscribers.subscriber_id=t1.subscriber_id 
        AND t1.field_id=37 
 WHERE (list_id=49) 
   AND (state=1)
 GROUP BY subscribers.email_address, 
          subscribers.first_name, 
          subscribers.last_name

geeft een uitlegplan van:

id  select_type  table        type  possible_keys           key            key_len  ref                             rows  Extra
1   SIMPLE       subscribers  ref   FK_list_id              FK_list_id     4        const                           2     Using where; Using filesort
1   SIMPLE       t1           ref   subscriber_fk,field_fk  subscriber_fk  4        test.subscribers.subscriber_id  1      

Hoewel ik die twee tabellen slechts met een zeer klein gegevensvolume heb gevuld, suggereert dit voor mij dat mijn versie van de query efficiënter zal worden uitgevoerd op de database, omdat deze niet de afgeleide tabel gebruikt die door uw query wordt gegenereerd.

De andere tabellen kunnen op vrijwel dezelfde manier aan de query worden gekoppeld en het volledige resultaat kan rechtstreeks naar een csv-bestand worden gespoold in plaats van verder te worden geparseerd met PHP.

Dit zou je een run moeten opleveren die zowel sneller als geheugenefficiënter is.

BEWERKEN

SELECT subscribers.email_address, 
       subscribers.first_name, 
       subscribers.last_name, 
       GROUP_CONCAT(DISTINCT t1.value SEPARATOR '|') AS Colors, 
       GROUP_CONCAT(DISTINCT t2.value SEPARATOR '|') AS Languages 
  FROM subscribers 
  LEFT JOIN subscribers_multivalued AS t1 
         ON subscribers.subscriber_id=t1.subscriber_id 
        AND t1.field_id=112 
  LEFT JOIN subscribers_multivalued AS t2 
    ON subscribers.subscriber_id=t2.subscriber_id 
   AND t2.field_id=37 
 WHERE (list_id=49) 
 GROUP BY subscribers.email_address, 
          subscribers.first_name, 
          subscribers.last_name

Let op het gebruik van DISTINCT in de GROUP_CONCAT() functie



  1. Postgres psql wordt niet herkend als een interne of externe opdracht

  2. Hoe voer je een MySQL-opdracht uit vanuit een shellscript?

  3. Waar is de veiligste plaats om MySQL-verbindingsdetails voor PHP te plaatsen?

  4. Waarom geen vensterfuncties in waar-clausules?