我目前有一个包含产品信息的表(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很陌生并通过索引以下列进行实验:类别,名称,网址,商店和商店/网址。
现在我的问题: 1)如果我想确保url字段是唯一的,这是正确的方法吗?我目前使用group by来合并关于一个url的所有信息。另一种方法可能是删除重复项(不知道如何执行此操作)。 2)如果当前的方法没问题,我该如何加快这个过程?
答案 0 :(得分: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
子句中的子查询。它允许在select
和where
(以及having
)子句中使用它们。这应循环遍历表,为每一行执行索引查找,只返回具有最小插入时间的行。