Mysql 使用来自大型select的数据执行大插入
我们正在为一家商店生成一些交叉销售数据。我们想展示“看过这个产品的客户,也看过这些产品”之类的东西。 为了生成这些数据,我们每天从基于会话的产品查看数据中进行查询Mysql 使用来自大型select的数据执行大插入,mysql,join,database-performance,Mysql,Join,Database Performance,我们正在为一家商店生成一些交叉销售数据。我们想展示“看过这个产品的客户,也看过这些产品”之类的东西。 为了生成这些数据,我们每天从基于会话的产品查看数据中进行查询 INSERT INTO product_viewed_together ( product, product_associate, viewed
INSERT INTO
product_viewed_together
(
product,
product_associate,
viewed
)
SELECT
v.product,
v2.product,
COUNT(*)
FROM
product_view v
INNER JOIN
product_view v2
ON
v2.session = v.session
AND v2.product != v.product
AND DATE_ADD(v2.created, INTERVAL %d DAY) > NOW()
WHERE
DATE_ADD(v.created, INTERVAL %d DAY) > NOW()
GROUP BY
v.product,
v2.product;
表产品视图
已连接到自身。由于该表相当大(约2600万行),因此结果更大。查询会产生大量的性能和时间
我没有用,我们选择了一个布局适合的问题在一个好的方式。有没有更好的方法来存储和生成这些数据 进行日期测试sargable:
DATE_ADD(v.created, INTERVAL %d DAY) > NOW()
-->
产品视图
a视图
?或表格
?如果是表,请提供两个“覆盖”索引:
也许你得到的所有计数都是甚至?这个错误可以用3种方法修复,每种方法都会使速度加倍。我认为最好的办法是将上的中的一行更改为
DATE_ADD(v2.created, INTERVAL %d DAY) > NOW()
-->
我想那会使速度加倍
但是,如果可以使用相同的创建两个不同的产品,则计数可能不完全正确
另一个问题:你将以
prod assoc CT
123 234 43
234 123 76 -- same pair, opposite order
我修改后的测试结果显示234比123来得更频繁
试试那些东西。但如果你还需要更多;我还有一个更具侵略性的想法
DATE_ADD(v2.created, INTERVAL %d DAY) > NOW()
v2.created > v.created
prod assoc CT
123 234 43
234 123 76 -- same pair, opposite order