2013-08-11 3 views
0

В настоящее время у меня есть таблица (AllProducts), которая содержит информацию о продукте. Он имеет 16 столбцов и около 125000 строк.Медленный запрос: категоризация данных

Мне нужно создать уникальное значение в базе данных, так как в таблице нет уникального значения. Я не могу использовать функцию автоматического увеличения, так как моя база данных очищается и заполняется снова ежедневно (и, следовательно, идентификация для определенных продуктов будет изменяться).

Я хочу использовать поле varchar (url), чтобы быть уникальным значением. Для этого я создал представление (AllProductsCategories), которое гарантирует уникальность комбинации URL и магазина.

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, магазин и магазин/URL.

Теперь мои вопросы: 1) Правильно ли это, если я хочу убедиться, что поле url уникально? В настоящее время я использую группу, чтобы объединить всю информацию об одном URL-адресе. Альтернативный подход может заключаться в удалении дубликатов (не уверен, как это сделать). 2) Если текущий подход в порядке, как я могу ускорить этот процесс?

+1

Вы должны использовать ограничения, чтобы не возникало проблема в первую очередь. – ffffff01

+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 и wherehaving). Это должно проходить через таблицу, делая индексный поиск для каждой строки, просто возвращая те, у которых минимальное время вставки.

+0

Отличное предложение; работает как шарм. Только нужно было изменить «от AllProducts ap» до «from AllProducts ap2» в подзапросе. – user2672492

Смежные вопросы