【发布时间】:2023-04-01 07:57:02
【问题描述】:
这是我在 MySQL 数据库上运行的查询。由于订单表中有更多记录,因此查询需要更多时间。请根据查询计划提出优化查询的提示。
mysql> 解释 SELECT DISTINCT dt.customer_id,dt.email,dt.title,dt.fname,dt.lname,dt。 工作电话,dt.mobile_phone,dt.home_phone,dt.blacklist_reason,dt。 域,dt.domain_group,dt.my_account_flag,dt.marketing_preference,dt。 城市,dt.address1,dt.address2,dt.state,dt。 国家,dt.zip,dt.country_code FROM(选择 cc.customer_id,cc.email,cc.title,cc.fname,cc.lname, cc.work_phone,cc.mobile_phone,cc.home_phone,cc.blacklist_reason, cc.domain,cc.domain_group,cc.my_account_flag,cc.marketing_preference, ca.city,ca.address1,ca.address2,ca.state, ca.country,ca.zip,ca.country_code,odd.order_date FROM customer cc INNER JOIN customer_address ca ON cc.customer_id=ca.customer_id left 外连接 order_delivery_details 奇数 cc.customer_id=odd.customer_id WHERE cc.lname = 'XXXXXX' 和
ca.address_purpose='XXXX' 和 ( cc.domain in ('XXXXXX_IE' ) || cc.domain_group in ( 'XXXXX' , 'YYYYYY' ) ) 以奇数.order_date 排序 desc) dt LIMIT 0,500;
SQL:
SELECT
DISTINCT dt.customer_id,
dt.email,
dt.title,
dt.fname,
dt.lname,
dt. work_phone,
dt.mobile_phone,
dt.home_phone,
dt.blacklist_reason,
dt. domain,
dt.domain_group,
dt.my_account_flag,
dt.marketing_preference,
dt. city,
dt.address1,
dt.address2,
dt.state,
dt. country,
dt.zip,
dt.country_code
FROM (
SELECT
cc.customer_id,
cc.email,
cc.title,
cc.fname,
cc.lname,
cc.work_phone,
cc.mobile_phone,
cc.home_phone,
cc.blacklist_reason,
cc.domain,
cc.domain_group,
cc.my_account_flag,
cc.marketing_preference,
ca.city,
ca.address1,
ca.address2,
ca.state,
ca.country,
ca.zip,
ca.country_code,
odd.order_date
FROM
customer cc
INNER JOIN customer_address ca ON cc.customer_id=ca.customer_id
left outer join order_delivery_details odd on cc.customer_id=odd.customer_id
WHERE cc.lname = 'XXXXXX'
and ca.address_purpose='XXXX'
and ( cc.domain in ( 'XXXXXX_IE' )
or cc.domain_group in ( 'XXXXX' , 'YYYYYY' )
)
order by odd.order_date desc
) dt
LIMIT 0,500;
感谢您的回复。我无法在子查询之外移动订单,因为主查询不包含 order_date 列。
这是要求。我们应该根据搜索条件搜索客户,并根据客户的最新 order_date 对客户进行排序。客户可以有多个订单,我们要挑选最新订单的order_date,对客户进行排序。
首先,我列出了所有加入订单表的客户,并根据 order_date 对所有记录进行排序。 一旦根据 order_date 对所有记录进行排序,如果客户有多个订单,则很有可能同一客户有多个记录。
现在我在其上应用 distinct (不包括 order_date)以获得明确的客户详细信息。
谢谢, 昌都
【问题讨论】:
-
ORDER BY 可能应该移到子查询之外。 MySQL 可能目前通过 DISTINCT 保持顺序,但没有其他 RDBMS 可以做到,我怀疑 MySQL 从长远来看会不会。
-
感谢您的回复。我无法在子查询之外移动订单,因为主查询不包含 order_date 列。
-
所有订单都没有order_delivery_details表的记录吗?当您订购以获得最新订单时,您是否关心没有订单的客户?那些没有订单的客户将最后排序,因此(有很多客户)极不可能被包含在最新的 500 中,并且内部连接可能会更快。
-
是的,对于某些客户,订单表中不会有记录。我们还需要考虑客户。所以我使用左外连接而不是内连接。
-
一个客户平均有多少订单?即,您有 10000 个客户,每个客户有 100 个订单,还是有 100 个客户每个客户有 10000 个订单?