0

我目前有一个包含产品信息的表(AllProducts)。它有 16 列和大约 125000 行。

我需要在数据库中创建一个唯一值,因为表中没有唯一值。我无法使用自动增量功能,因为我的数据库每天都会被清空并再次填充(因此特定产品的 ID 会发生变化)。

我想使用 varchar 字段(url)作为唯一值。为了做到这一点,我创建了一个视图(AllProductsCategories),它确保 url 和 shop 的组合是唯一的。

select min(`a`.`insertionTime`) AS `insertionTime`,
`a`.`shop` AS `shop`,
min(`a`.`name`) AS `name`,
min(`a`.`category`) AS `category`,
max(`a`.`description`) AS `description`,
min(`a`.`price`) AS `price`,
`a`.`url` AS `url`,
avg(`a`.`image`) AS `image`,
min(`a`.`fromPrice`) AS `fromPrice`,
min(`a`.`deliveryCosts`) AS `deliveryCosts`,
max(`a`.`stock`) AS `stock`,
max(`a`.`deliveryTime`) AS `deliveryTime`,
max(`a`.`ean`) AS `ean`,
max(`a`.`color`) AS `color`,
max(`a`.`size`) AS `size`,max(`a`.`brand`) AS `brand` 
from `AllProducts` `a` group by `a`.`url`,`a`.`shop` 
order by NULL

这工作正常,但速度很慢。下面的查询需要 51 秒才能完成:

SELECT * FROM ProductsCategories ORDER BY NULL LIMIT 50 

我对 MySQL 很陌生,并通过索引以下列进行了实验:类别、名称、url、shop 和 shop/url。

现在我的问题是:1)如果我想确保 url 字段是唯一的,这是正确的方法吗?我目前使用 group by 来合并有关一个 url 的所有信息。另一种方法可能是删除重复项(但不确定如何执行此操作)。2)如果当前的方法可以,我怎样才能加快这个过程?

4

1 回答 1

0

如果数据每天都重新加载,那么您应该在重新加载时修复它。

也许这是不可能的。我建议采用以下方法,假设三元组url, shop,InsertionTime是唯一的。首先,在url, shop, InsertionTime. 然后使用这个查询:

select ap.*
from AllProducts ap
where ap.InsertionTime = (select InsertionTime
                          from AllProducts ap2
                          where ap2.url = ap.url and
                                ap2.shop = ap.shop
                          order by InsertionTime
                          limit 1
                         );

MySQL 不允许from视图子句中的子查询。它确实允许它们出现在selectand where(and having) 子句中。这应该循环遍历表,对每一行进行索引查找,只返回插入时间最短的那些。

于 2013-08-11T16:42:32.637 回答