从一个表迁移到另一个
我有2个表,一个拥有10万条数据记录,一个以“不感兴趣”从一个表迁移到另一个
表“的企业”有一个“BusinessID |约10分其他信息列
表“不感兴趣”有一个“BusinessID”和一个DateOfCall
目前我通过检查,如果存在,如果存在不感兴趣和DateOfCall小于42天然后不显示它在选择。代码如下)
SELECT * FROM businesses where PostCode like '" . $pcode . "%'
and BusinessType like '%$btype%'
and BusinessID NOT IN (SELECT BusinessID FROM telesales.notinterested WHERE NOW() BETWEEN DateOfCall and (DateOfCall + INTERVAL 42 DAY))
and AppointmentDate is null
ORDER BY RAND() limit 100"
起初很好,但现在“不感兴趣”有大约30,000条记录,它变得非常缓慢,尤其是一个字母邮编。
我在bussinesses表中添加了一个名为“notinterested”的新列,而我想在那里放一个日期。
将DateOfCall从“notinterested”表中迁移到“Businesses”中新列的最简单方法是什么?林有点担心,因为它的实时数据,并没有太多的时间
要回答您的原始问题,您可以运行此查询以更新添加的日期字段。
UPDATE businesses
INNER JOIN
(SELECT BusinessID, MAX(DateOfCall) maxdateofcall FROM telesales.notinterested WHERE NOW() BETWEEN DateOfCall AND (DateOfCall + INTERVAL 42 DAY) GROUP BY BusinessID) recentnotinterested
ON businesses.BusinessID = recentnotinterested.BusinessID
SET businesses.notinterested = recentnotinterested.maxdateofcall;
嗨里克谢谢你的答案,但它只更新了1行,任何想法为什么? –
嗨@AlexBanerjee,我忘记了GROUP BY语句。我编辑了答案。请再试一次。 –
工作的一种享受,谢谢。还有点慢。
编辑:没有工作的治疗,但它好一点。
SELECT * FROM businesses where PostCode like '" . $pcode . "%'
and BusinessType like '%$btype%'
and NOT EXISTS (SELECT b.BusinessID FROM businesses b
left join telesales.notinterested ni on ni.BusinessID = b.BusinessID
WHERE (ni.DateOfCall > NOW() + INTERVAL 42 DAY))
and AppointmentDate is null
LIMIT 200
您是否对原始查询尝试了日期处理建议? “不存在”并不总是更快;因为它需要您将其更改为相关的子查询,所以必须为外部查询中的每一行执行子查询;恢复为“NOT IN”版本会导致代价较高的子查询,但是仅针对整个外部查询运行一次(因为它将不再相关)。 – Uueerdo
使用不存在vs不在。不在必须比较每个记录不存在一旦找到单个记录可以退出提前退出。由兰特订购也将是缓慢的,因为它必须为每个记录产生一个随机值,然后限制在前100位。而且你是否必须在两边都用%%来做呢?我会认为BusinessType可能是一个平等检查VS LIKE。我可以理解邮编+5或不是......但是商业类型......没有那么多 – xQbert
如果您别无选择,只能在实时数据库上运行查询,请始终将其备份到测试数据库并在那里测试查询第一!如果这里有人犯了半点错误,而你却盲目地运行它,结果可能会变得更糟! – icecub
感谢您的建议,我并不知道 –