gpt4 book ai didi

MySQL疯狂跨表查询求助!

转载 作者:行者123 更新时间:2023-11-29 06:20:09 25 4
gpt4 key购买 nike

我需要执行这个查询,我必须解析与另一个表中的另一个字段匹配的字段信息,然后在多个表中进行冲洗和重复,最后返回所需的行。

问题是,我怎样才能加快速度......它返回数十万行,并且对于我的客户在其管理部分来说效果不太好,因为查询导致崩溃。

这是查询:

SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email 
FROM (
SELECT CU_id, CU_ship_name1, CU_ship_name2, CU_email
FROM customers
WHERE CU_solicit=1
AND CU_cdate >=".$startDate."
AND CU_cdate <=".$endDate."
)AS t1
INNER JOIN orders AS t2 ON t1.CU_id = t2.O_cid
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id FROM category WHERE C_store_type =1
) AS t5 ON t4.P_cat = t5.C_id

“客户”、“订单”、“商品”表每月更新数以万计的新行,“产品”表每月至少接收一百个新行。

我唯一能想到的就是创建一个保存此信息的新表(这不是理想的解决方案),并向这些表添加索引。我担心索引,因为这些表获取了大量新数据,但我愿意尝试它(总是可以撤消它吗?)。但是我不相信索引会自行解决问题。

更新:我现在正在使用这个查询并获得更快的结果,对所有 WHERE 和 JOIN ON 行建立索引根本没有多大帮助......我不明白为什么。

删除子查询:

对我的查询速度也产生了灾难性的影响,在相同的参数下,从下面的查询的 3-4 秒到 151 秒。

SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email 
FROM customers AS t1
WHERE t1.CU_solicit=1
AND t1.CU_cdate>= 20100725000000
AND t1.CU_cdate<= 20100801000000
AND EXISTS(
SELECT NULL FROM orders AS t2
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id
FROM category
WHERE C_store_type = 2
) AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_id = t2.O_cid);

没关系,我将它们更改为正常连接并且没有子查询,并且在完成所有操作之后,这件事现在快如闪电。现在的查询如下:

SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email 
FROM customers AS t1
JOIN orders AS t2 ON t1.CU_id = t2.O_cid
JOIN item AS t3 ON t2.O_ref = t3.I_oref
JOIN product AS t4 ON t3.I_pid = t4.P_id
JOIN category AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_solicit =1
AND t1.CU_cdate >=20100425000000
AND t1.CU_cdate <=20100801000000
AND t5.C_store_type =2

最佳答案

我会尝试两件事:

1) 在 ON 和 WHERE 子句中使用的列上添加索引

2) 通过将子查询重写为正常的 JOIN 和 WHERE 条件来消除子查询

只有在完成这些操作并发现问题仍然存在后,您才应该考虑其他选择。

除了不必要的子查询之外,这看起来确实是一个非常简单的查询。即使有数百万行,您也不会期望它会变慢,除非您没有定义索引,MySQL 可用的内存太少,或者您对可用资源的 MySQL 服务器本身配置得非常糟糕。

每月一万行新行不算什么。您每隔几分钟就会插入一个新行。在决定定义哪些索引时,这甚至都不是考虑因素。廉价服务器上的 MySQL 每秒可以处理数百次插入。

关于MySQL疯狂跨表查询求助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com