Mysql使用管道分隔字段加入

时间:2015-03-31 22:26:21

标签: mysql join

我有2张桌子,我加入这个方式:

UPDATE wm_rendi rendi JOIN wm_acquisti ON rendi.isrc_isbn = wm_acquisti.barcode SET rendi.user_id = wm_acquisti.user_id WHERE rendi.user_id IS NULL

此查询需要24小时才能完成...

这是wm_acquisti表,有+ 18'000条记录:

USER_ID    BARCODE
12         600001
56         500003
12         600007
12         800018
32         100004
56         500007
...        ...

这是wm_rendi表,到目前为止有910'040条记录:

USER_ID      ISRC_ISBN
NULL         600001
NULL         500003
...          ...

所以,由于loooooong采取了这个查询,我以为我可以这样缩短wm_acquisti

USER_ID    BARCODE
12         600001|600007|800018
56         500003|500007
32         100004

重点是我必须根据条形码加入这两个表格,但这需要很长时间。

有没有办法使用较短的表格(管道分隔条形码)或任何其他方法获得相同的连接?

1 个答案:

答案 0 :(得分:1)

可以编写一个可以模拟该连接操作的查询。但你不想。这将是缓慢的,它将是丑陋的,它将是不可维护的。

请记住,连接的速度不受表中的数量的影响,而是受必须执行的二进制比较操作的数量的影响。影响这一点的是

  1. 每个表中的数据点数。这些点的存储方式并不重要。您仍然需要将一个表中的每个条形码与另一个表中的每个条形码进行比较。

  2. 指标。请记住,没有索引的连接需要进行O(nxm)二进制比较,其中n是较小表中的行数,m是较大表中的行数。另一方面,值的索引查找是O(log(n)),因此如果查询优化器是智能的,则应该采用O(nlog(m))操作。在您的情况下,索引字段将快45,000倍。因此,如果您没有索引,或者RMDBS没有使用它们,那就是一面旗帜。

  3. 同样确保wm_rendi.USER_ID被编入索引,这将使空查找缩短一个数量级。

    确保所有列当然都有唯一的约束。

    正如几位人士指出的那样,永远不会在表格中存储分隔数据的充分理由。它打破了常态,减慢了查询速度,并且通常会使一切变得糟糕。