sql >> データベース >  >> RDS >> Mysql

phpのデータベースからcsvへのメモリ使用量のエクスポート

    2つのテーブルのみを使用する:

    元のクエリ:

    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)
    

    の説明計画を示します:

    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
    

    私の参加提案:

    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
    

    の説明計画を示します:

    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      
    

    これらの2つのテーブルにはごく少量のデータしか入力していませんが、クエリが生成する派生テーブルを使用していないため、私のバージョンのクエリはデータベースに対してより効率的に実行されることを示唆しています。

    >

    他のテーブルもほぼ同じ方法でクエリにリンクでき、結果全体がPHPでさらに解析されるのではなく、csvファイルに直接スプールされます。

    これにより、より高速でメモリ効率の高い実行が可能になります。

    編集

    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
    

    GROUP_CONCAT()関数でのDISTINCTの使用に注意してください



    1. 内部結合を使用したPostgreSQLの削除

    2. Postgresデータ型キャスト

    3. 年を保存するためのMySQLタイプ:SmallintまたはVarcharまたはDate?

    4. SQLオラクル初心者の質問