2013-06-28 4 views
1

Вот запрос, что займет 12 секундMysql запрос выполняется слишком долго или условие

SELECT SQL_CALC_FOUND_ROWS DISTINCT `t`.* FROM `wp_pods_bars` AS `t` 
LEFT JOIN `wp_podsrel` AS `rel_city` ON 
    (`rel_city`.`field_id` = 13918 AND `rel_city`.`item_id` = `t`.`id`) OR 
    (`rel_city`.`related_field_id` = 13918 AND `rel_city`.`related_item_id` = `t`.`id`) 

если я

SELECT SQL_CALC_FOUND_ROWS DISTINCT `t`.* FROM `wp_pods_bars` AS `t` 
LEFT JOIN `wp_podsrel` AS `rel_city` ON 
    (`rel_city`.`field_id` = 13918 AND `rel_city`.`item_id` = `t`.`id`) 

или

SELECT SQL_CALC_FOUND_ROWS DISTINCT `t`.* FROM `wp_pods_bars` AS `t` 
LEFT JOIN `wp_podsrel` AS `rel_city` ON 
    (`rel_city`.`related_field_id` = 13918 AND `rel_city`.`related_item_id` = `t`.`id`) 

каждый запрос выполняется 0,09 секунды , Почему так и как это исправить?

РЕДАКТИРОВАТЬ:

EXPLAIN SELECT SQL_CALC_FOUND_ROWS DISTINCT `t`.* FROM `wp_pods_bars` AS `t` 
LEFT JOIN `wp_podsrel` AS `rel_city` ON 
    (`rel_city`.`related_field_id` = 13918 AND `rel_city`.`related_item_id` = `t`.`id`) 

результат

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra 
1,SIMPLE,t,ALL,NULL,NULL,NULL,NULL,1340,Using temporary 
1,SIMPLE,rel_city,ref,rel_field_rel_item_idx,rel_field_item_idx,rel_field_rel_item_idx,14,const,barchick.t.id,1,Using index; Distinct 

второй

EXPLAIN SELECT SQL_CALC_FOUND_ROWS DISTINCT `t`.* FROM `wp_pods_bars` AS `t` 
LEFT JOIN `wp_podsrel` AS `rel_city` ON 
(`rel_city`.`related_field_id` = 13918 AND `rel_city`.`related_item_id` = `t`.`id`) 

результат

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra 
1,SIMPLE,t,ALL,NULL,NULL,NULL,NULL,1340,Using temporary 
1,SIMPLE,rel_city,ref,rel_field_rel_item_idx,rel_field_item_idx,rel_field_rel_item_idx,14,const,barchick.t.id,1,Using index; Distinct 
+0

У вас есть указатель на 't.id' и' rel_city.related_item_id'? –

+0

Подготовить 'EXPLAIN' к каждому из запросов и вставить результаты. – hjpotter92

+0

@JW да все индексируется –

ответ

1

Присоединение к вам LEFT является избыточным, поскольку вы не используете правую таблицу для чего-либо в результатах. И любые повторяющиеся строки, созданные соединением, удаляются DISTINCT.

Таким образом, ваш запрос эквивалентен этому тот, который извлекает все строки из таблицы (до тех пор, пока существует первичный или уникальный ключ в wp_pods_bars):

SELECT t.* FROM wp_pods_bars AS t ; 

Нет DISTINCT, нет JOIN, нет OR.


Существует функция в MariaDB, называется Table Elimination (см также в Sergey Petrunia's blog для объяснения), которые могут работать как ваше желание и устранить присоединиться, но, конечно, переключение с MySQL на MariaDB не может быть доступный вариант для вас.