2013-10-04 3 views
1

Я хочу, чтобы оптимизировать SQL-запроскак оптимизировать SQL-запрос присоединиться

SET SQL_BIG_SELECTS=1; 
SELECT 
    `Surveys`.`fname` 
    , `Surveys`.`lname` 
    , `Surveys`.`smobile` 
    , `Surveys`.`semail`  
    , `Surveys`.`country` 
    , `Surveys`.`city`  
    , `Surveys`.`sdob` 
    , `Brand`.`brandname` 
    , `Product`.`productname`   
    , `Surveys`.`outletcode` 
    , `Surveys`.`outletname` 
    , `Surveys`.`coupon_no` 
    , `Users`.`username` 
    , DATE_ADD(`Surveys`.datetime, INTERVAL 8 HOUR) as datetime 
    , `Surveys`.`duration`  
    , userentry.couponcode as wcouponcode 
    , userentry.couponcodecountry 
    , userentry.prizename 
    , DATE_ADD(userentry.datetime, INTERVAL 8 HOUR) as wdatetime  
FROM 
    `Surveys` 
    INNER JOIN `Brand` 
     ON (`Surveys`.`brandid` = `Brand`.`brandid`) 
    INNER JOIN `Product` 
     ON (`Surveys`.`productid` = `Product`.`productid`) AND (`Surveys`.`brandid` = `Product`.`brandid`)  
    INNER JOIN `Users` 
     ON (`Surveys`.`userid` = `Users`.`userid`) 
    INNER JOIN `userentry` 
     ON (`userentry`.`mobile` = `Surveys`.`smobile`) 

здесь, если я не пишу SET SQL_BIG_SELECTS = 1; он не работает

даже с SQL_BIG_SELECTS его истекать (SQL тайм-аута),

так, как оптимизировать этот запрос

Пожалуйста, помогите мне

+1

Вы видели это? http://stackoverflow.com/questions/950465/mysql-sql-big-selects Являются ли индексы в полях объединения? Сколько записей в таблице и сколько записей вы ожидаете получить? Вы помещали EXPLAIN перед SELECT, чтобы увидеть, как MySQL это выполнит? – AgRizzo

+0

Спасибо всем, но есть ли какие-либо изменения в запросе или просто индексирование? , У меня есть upvoted все, спасибо снова – anytime

+0

Главный вопрос вот почему вам нужны все эти строки (в той степени, в которой вам нужны 'SQL_BIG_SELECTS')? Потому что, если вы собираетесь применить еще пару условий или предложение LIMIT, у вас будет другой запрос. – newtover

ответ

1

Вы должны индексировать столбцы, которые вы используете в вашем select statement (brandId, productid, userid, mobile)

1

Общие столбцы между обеими таблицами, включенными в объединение, должны быть проиндексированы.

2

Есть всегда 2 вещи, которые необходимо учитывать при оптимизации запросов:

  • Какие индексы могут быть использованы (возможно, потребуется создать индексы)

  • Как запрос пишется (возможно, потребуется изменить запрос, чтобы позволить оптимизатору запросов, чтобы быть в состоянии найти соответствующие индексы, а не повторного чтения данных с избыточностью)

ключи:

1.You не нужен подзапросы - просто сделать прямые соединения и совокупного

2.You должен быть в состоянии использовать внутренние соединения, которые, как правило, более эффективны, чем внешние соединения

+0

как упомянутые ключевые моменты относятся к запросу выше? – newtover

0

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

Так как ваш запрос выглядит, как и все другие таблицы больше «поиск» только для справки, и ваша таблица Surveys является критической корневой таблицей, просто измените

SELECT (... остальной запрос)

в

ВЫБОР STRAIGHT_JOIN (... остальное запроса)

Это говорит оптимизатор, чтобы сделать это в том порядке, как вы указали.

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