この記事に触発されて、データベースからのメンバーリストのエクスポート機能を最適化してみました。
元のクエリは次のようになります。
-- First query
SELECT
*
FROM
members_customer_id_0000000169
WHERE
deleted = '0000-00-00 00:00:00'
-- Second query run for every result from first query
SELECT
stores.external_store_id AS local_store_id
FROM
regions,
stores,
stores_reference_members_customer_id_0000000169
WHERE
regions.customer_id = 169
AND
stores.region_id = regions.id
AND
stores_reference_members_customer_id_0000000169.member_id =' . $result['id'] . '
AND
stores_reference_members_customer_id_0000000169.store_id = stores.id
最初のクエリは 18 万行を返し、そのパフォーマンスは効率的ではありません。2 番目のクエリは 18 万回すべてをフェッチします。
私は代わりにこれをやってみました:
SELECT
members_customer_id_0000000169.*,
stores.external_store_id AS local_store_id
FROM
members_customer_id_0000000169
LEFT JOIN
stores_reference_members_customer_id_0000000169
ON
stores_reference_members_customer_id_0000000169.member_id = members_customer_id_0000000169.id
JOIN
regions
JOIN
stores
WHERE
members_customer_id_0000000169.deleted = '0000-00-00 00:00:00'
AND
regions.customer_id = 169
AND
stores.region_id = regions.id
AND
stores_reference_members_customer_id_0000000169.store_id = stores.id
結果はわずか14万行です。local_store_id
その理由はおそらく、意図したように a なしでメンバーを取得できないためです。そして、何が問題なのかわからない。
多くのテーブルと WHERE 句があるため、結合に問題があると確信していますが、2 つのテーブル間で LEFT/RIGHT 結合を実行した経験しかありません。
誰でも問題を特定できますか?