0

この記事に触発されて、データベースからのメンバーリストのエクスポート機能を最適化してみました。

元のクエリは次のようになります。

-- 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 結合を実行した経験しかありません。

誰でも問題を特定できますか?

4

1 に答える 1

1

各 JOIN 操作には、新しいテーブルからレコードをマージする方法を SQL に指示する、対応する ON ステートメントが必要です。問題を引き起こしている可能性がある WHERE ステートメントでそのロジックの一部を実行しているようです。

また、local_store_id なしでメンバーを取得する限り、ストアで内部結合を行っている可能性があるため、結果セットには、結合ロジックに基づいてストアに対応する行を持つメンバーのみが含まれます。左外部結合は、探しているものを提供する場合があります。

于 2012-04-26T11:47:49.797 に答える