2013-10-04 3 views
0

У меня есть таблица MySql со следующей схемой.Есть ли способ оптимизировать этот запрос MYSQL

table_products - "product_id", product_name, product_description, product_image_path, brand_id 
table_product_varient - "product_id", "varient_id", product_mrp, product_sellprice, product_imageurl 
table_varients - "varient_id", varient_name 
table_product_categories - "product_id", "category_id" 

и это Mysql select запрос я использую для извлечения данных для предоставленного пользователем категории.

select * from table_products, table_product_varients, table_varients, table_product_categories where table_product_categories.category_id = '$cate_id' && table_product_categories.product_id = table_products.product_id && table_products.product_id = table_product_varients.product_id && table_varients.varient_id = table_product_varients.varient_id 

Проблема заключается в том, что, как таблица содержит много продуктов, и каждый продукт содержит много varients, это занимает слишком много времени для извлечения данных. И я сомневаюсь, что по мере того, как данные будут расти, время будет увеличиваться для извлечения элементов. Есть ли оптимизированный способ добиться того же.

Ваша помощь будет высоко оценена.

Devesh

+2

Вы действительно используете '&&' вместо' AND'? –

+4

Вам действительно нужно достать все предметы? Почему бы просто не использовать «ограничение» в запросе и «пейджинг» в системе? И действительно ли вам нужно получить все поля (вы используете * в запросе) - вы можете указать, какие поля получить, чтобы он извлекал меньше полей (он значительно увеличит скорость) –

+0

@Christian Да, я использую &&. Есть ли разница между && и AND. –

ответ

2

запрос ниже будет отталкиваться, или что-то подобное

SELECT 
    * 
FROM 
    table_products P 
INNER JOIN 
    table_product_categories PC 
ON 
    PC.product_id = P.product_id 
INNER JOIN 
    table_product_varients PV 
ON 
    P.product_id = PV.product_id 
INNER JOIN 
    table_varients V 
ON 
    V.varient_id = PV.varient_id 
where 
    table_product_categories.category_id = '$cate_id' 

и как это было предложено сделать вам действительно нужно return *, так как это означает, что sele cting всех столбцов из всех таблиц в запросе, которые, как мы знаем из самих объединений, дублируем.

вы должны использовать индексирование таблиц для более быстрых запросов, установить отношения между таблицами соединений, это также обеспечит ссылочную целостность.

Надеюсь, что это имеет смысл и помогает :)

+0

Спасибо за быстрый ответ. Я могу наблюдать некоторые существенные различия. –

1

да вы правы, запрос вы используете выше, не является эффективным:

вы можете получить тот же результат, как и выше, используя ON пункт вместо where пункта.

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

Где, как и в случае ON пункта, объединение haappens только на строках, которые встречались в condidtion, указанный в предложении ON

so..make ваш запрос, как показано ниже:

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

Надеется, что это помогает ..

+0

Насколько я знаю в MySQL, они должны быть оптимизированы для выполнения с тем же планом (http://stackoverflow.com/questions/5273942/mysql-inner-join-vs-where). Однако включение условий соединения в предложение WHERE менее читаемо и подвержено ошибкам, когда кто-то забывает одно из условий соединения, в результате чего появляется CROSS JOIN. – Kickstart

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