Долго выполняется JOIN

_RVK_

Новичок
Долго выполняется JOIN

Есть 3 таблицы. Из одной мне нужно выбрать все записи и присоеденить записи из двух других таблиц.
Но следующий запрос жутко тормозит и вешает систему.
PHP:
SELECT catalog_data.name,catalog_tree.clevel, catalog_tree.cid, catalog_data.description,catalog_data.weight,catalog_data.spec_id,catalog_prices.code,catalog_prices.value 
FROM catalog_tree 
RIGHT JOIN catalog_prices ON (catalog_tree.cid=catalog_prices.fk_catalog_tree)  
RIGHT JOIN catalog_data ON (catalog_tree.cid=catalog_data.fk_catalog_tree) 
WHERE cleft BETWEEN 1 AND 8150 ORDER BY cleft LIMIT 0,100
В чем дело?
 

_RVK_

Новичок
2Demiurg
+------------------+--------+---------------+---------+---------+----------------------------------+-------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+------------------+--------+---------------+---------+---------+----------------------------------+-------+---------------------------------+
| catalog_data | ALL | NULL | NULL | NULL | NULL | 4074 | Using temporary; Using filesort |
| catalog_prices | ALL | NULL | NULL | NULL | NULL | 37540 | |
| catalog_tree | eq_ref | PRIMARY | PRIMARY | 4 | catalog_prices.fk_catalog_tree | 1 | |
+------------------+--------+---------------+---------+---------+----------------------------------+-------+---------------------------------+

-~{}~ 26.08.04 16:23:

Таблицы:

catalog_tree
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| cid | int(10) unsigned | | PRI | NULL | auto_increment |
| cleft | int(10) unsigned | | MUL | 0 | |
| cright | int(10) unsigned | | | 0 | |
| clevel | int(10) unsigned | | | 0 | |

catalog_data
+-----------------+-----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| fk_catalog_tree | int(11) | | MUL | 0 | |
| name | char(255) | | MUL | '' | |
| description | char(255) | YES | | NULL | |
| spec_id | int(11) | YES | | NULL | |
| code | int(11) | | MUL | 0 | |
| pict | int(11) | YES | | NULL | |
| weight | float | YES | | NULL | |
+-----------------+-----------+------+-----+---------+----------------+
catalog_prices
+-----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| fk_catalog_tree | int(11) | | MUL | 0 | |
| name | char(255) | | MUL | ' | |
| code | char(255) | | MUL | 1 | |
| value | float(11,2) | YES | | NULL | |
+-----------------+-------------+------+-----+---------+----------------+
 

_RVK_

Новичок
Спасибо, заработало. Сам не пойму по какой причине использовал RIGHT. Наверное, не до конца понимаю работу JOIN. Я так и не понял почему запрос тормозил. из EXPLAIN селекта видно, что не используются некоторые индексы. Но почему?
 

Falc

Новичок
Diesel
Индексы вообще никакие у тебя тут не используются.
Если ты не понимаешь простого джойна то юзать райт джоит пока тебе рано. Сделай все через лефт джоит и еще раз прочитай мою статью, там как раз написано какие индекси надо ставить при
JOIN.​
 

_RVK_

Новичок
Falc
Я понял какие индексы надо ставить. Я не понял почему. У меня ведь есть индексы по всем полям, участвующем в запросе, но MYSQL их не использует. Вот я и не пойму, из каких таких соображений она это делает.
запрос
...FROM a
RIGHT JOIN b ON (a.id=b.fk_a)
RIGHT JOIN c ON (a.id=c.fk_a)...

Записи выбираются в порядке с,b,a; индексы нужны на a.id и b.fk_a. Но они там есть, просто Mysql их не использует...

Просто хочу понять, чтоб больше таких глупых вопросов не возникало.
 

Falc

Новичок
Diesel
>>Просто хочу понять

Первое что надо тебе понят - это то что не надо использовать RIGHT JOIN там где можно использовать LEFT JOIN.

Если перепишеь запрос с лефт джойнами я раскажу какие индексы тебе надо поставить.
 

Boratustra

Новичок
Originally posted by Falc
Первое что надо тебе понят - это то что не надо использовать RIGHT JOIN там где можно использовать LEFT JOIN.[/B]
Простите, что врываюсь, но очень интересно, Falc, а в чем принципиальная разница между RIGHT JOIN и LEFT JOIN?
Я раньше думал, что только в порядке включения таблиц в запрос....
Если не трудно, можешь кинуть ссылку на нужный раздел мана?
 

_RVK_

Новичок
Falc
Вот новый запрос:
PHP:
SELECT * FROM catalog_tree 
LEFT JOIN catalog_prices ON (catalog_tree.cid=catalog_prices.fk_catalog_tree)  
LEFT JOIN catalog_data ON (catalog_tree.cid=catalog_data.fk_catalog_tree) 
WHERE (catalog_prices.code=1 OR catalog_prices.code IS NULL)  AND cleft BETWEEN 1 AND 8150 ORDER BY cleft
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Boratustra
Простите, что врываюсь, но очень интересно, Falc, а в чем принципиальная разница между RIGHT JOIN и LEFT JOIN?
Принципиальная разница в том, что Falc умеет использовать LEFT JOIN, а RIGHT --- не умеет.
 

Falc

Новичок
Boratustra
Разница в наглядности и удобности.
Почему мы читаем слева на право а не справо на лево?

Sad Spirit
Тебе не стоило влезать в эту тему.

-~{}~ 27.08.04 13:18:

http://dev.mysql.com/doc/mysql/ru/JOIN.html

"RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN."
 

Boratustra

Новичок
Originally posted by Falc
Boratustra
Разница в наглядности и удобности.

ах, ясно. сенкс, просто ты так написал, что я подумал: дело в особенностях внутренней структуры MySQL:)
пардон, что прервал диалог:)
 

Falc

Новичок
Diesel
Тебе нужны индексы:
catalog_prices.fk_catalog_tree
catalog_data.fk_catalog_tree

Сделай их и покажи експлаин
 

_RVK_

Новичок
Sad Spirit
Покажи пример когда необходимо использовать RIGHT. Это будет лучшим ответом на вопрос.

Меня вообщем-то интересует вопрос: то что mysql ТАК оптимизирует запрос это фича или недостаток?
 

_RVK_

Новичок
| table | type | possible_keys | key | key_len | ref | rows | Extra |
_____________________________________________
| catalog_tree_0 | ALL | cleft | NULL | NULL |NULL | 4075 | where used; Using filesort |
| catalog_prices_0 | ref | fk_catalog_tree | fk_catalog_tree | 4 | catalog_tree_0.cid | 20 | |
| catalog_data_0 | ref | fk_catalog_tree | fk_catalog_tree | 4 | catalog_tree_0.cid | 20 | |
 
Сверху