2013-04-05 3 views
1

У меня в настоящее время проблема с SQL-запросом. У меня есть таблица продуктов, которая содержит поле colour_code. Я не могу изменить таблицу продуктов, поскольку она берется из внешнего источника.Проблема с запросом на соединение Mysql

На веб-сайте пользователь может искать продукт по colour_code и возвращать все продукты, доступные в этом цвете.

Задача заключается в том, чтобы иметь другой поисковый запрос, возвращающий определенный продукт, который имеет другой цветовой код. Для этого я добавил новую таблицу с именем colour_code_alias, которая просто имеет поле colour_code, которое соответствует полю colour_code в таблице продуктов и полю псевдонима, которое вернет этот результат. См. Примеры ниже.

**Product_tb** 
id, colour_code 
1, "ABC" 

**colour_code_alias_td** 
colour_code,alias 
"ABC","XYZ" 

Таким образом, если пользователь ищет XYZ, они должны быть возвращены продукт с идентификатором 1. Если они ищут «ABC», они также должны быть возвращены продукт с идентификатором 1.

Моя проблема заключается в том, что запрос занимает слишком много времени, так как он не использует индекс. Мой упрощенный запрос ниже:

Select * from product 
left join colour_code_alias cca on cca.colour_code = product.colour_code 
where (product.colour_code = 'XYZ' or cca.alias = "XYZ") 

Когда я использую объяснение, он показывает, что он не использует ключ для этого запроса. Когда я удаляю 'или cca.alias = "XYZ" в предложении where, используется индекс colour_code из таблицы продуктов.

Я ищу помощь, чтобы повысить производительность такого запроса, как я должен индексировать этот тип запроса или даже переписывать его?

Любая помощь приветствуется.

Thanks, Martin.

как примечание относительно того, что я сделал .. Я удалил левое соединение и добавил запрос выбора в предложение where. Запрос выглядит так:

Select * from product 
where (product.colour_code = 'XYZ' or product.colour_code = (select colour_code from colour_code_alias where alias = 'XYZ')); 
+0

индексируется cca.alias? – mconlin

+0

да ... Я протестировал, используя 3 индекса на этом .. colour_code, alias и составной индекс colour_code_alias. – Martin

ответ

1

У вас должен быть указатель на product.colour_code и псевдоним наверняка.

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

'ABC','ABC' 

что путь у вас есть одно место, чтобы посмотреть.

EDIT:

еще одна мысль - использовать цифровые клавиши вместо строк - это будет более эффективным также. (Но может быть трудно, если вы не можете изменить таблицу)

+0

У меня есть индексы, настроенные на продукте, и таблица псевдонимов ok .. хм .. Я мог бы попробовать добавить оригинал в таблицу псевдонимов. - Хотя, если таблица продуктов получает новый продукт, это не будет доступно для поиска, пока я не забуду таблицу псевдонимов новым цветовым кодом. – Martin

+0

Я не могу использовать числовые ключи, как вы там говорите, я не могу изменить таблицу.colour_code может быть одинаковым для нескольких продуктов. – Martin

1

Вы можете попробовать этот запрос:

select *, 
(select id from product where colour_code = cod.colour_code) as id_prod 
from 
colour_code_alias cod 
where (cod.colour_code = 'ABC' or cod.alias = 'XYZ') 
+0

Привет, спасибо за предложение .. он, кажется, возвращает id, но я упростил свой вопрос, если бы я сказал, что мне нужны все столбцы для продукта, это изменится. Я обновил свой запрос и изменил предложение where, чтобы включить: 'где product.colour_code = 'ABC' или product.colour_code IN (выберите colour_code из colour_code_alias, где alias = 'XYZ')' Кажется, будет немного лучше, но все еще немного медленный – Martin

+0

Измените IN для an = .... кажется, это проблема индекса в ваших таблицах .... declare product.colour_code и colour_code_alias.alias как индексы – Hackerman

+0

Спасибо за предложение. Я изменил IN для «=», и, похоже, он работает быстрее. У меня уже установлены индексы для обеих этих таблиц/полей. В запросе объяснения пока нет ключа для product.colour_code. – Martin

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