慢查询:数据分类

时间:2013-08-11 16:21:45

标签: mysql

我目前有一个包含产品信息的表(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)如果当前的方法没问题,我该如何加快这个过程?

1 个答案:

答案 0 :(得分:0)

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

也许这是不可能的。假设三urlshopInsertionTime是唯一的,我会建议采用以下方法。首先,在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子句中的子查询。它允许在selectwhere(以及having)子句中使用它们。这应循环遍历表,为每一行执行索引查找,只返回具有最小插入时间的行。