|
|
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
Есть две таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. К ним запрос Код: plaintext 1. 2. 3. Смысл запроса: есть значение, получить из opa его 'синонимы' и использовать это значение и синонимы для поиска в таблице xex. EXPLAIN запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Внимание, вопрос: как убрать ALL отсюда, чтобы при присоединении все-таки использовался ключ symbol? Потому как если он не используется, то запрос типа: Код: plaintext 1. 2. 3. 4. 5. сделает гигантскую таблицу (при условии, что таблица xex немаленькая) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2004, 23:17 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
ибо сказано, что в OR-предикатах индексы не юзаются. ma X mo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 16:50 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
хотя нет... необходимо ведь перебрать все xex.symbol, правильно? вот они все и перебираются. ma X mo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 17:05 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
И что, никак не сделать, чтобы вместо перебора два раза использовался индекс? (и кстати, где сказано, что с OR индексы не используются - где почитать?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 17:53 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
А что значит с OR индексы не используются! Очень странное высказывание, хотя это возможно и правда! Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 20:17 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
А вам не подойдет раскрытие одного запроса с OR и без индексов в два запроса с индексами соединенные через UNION? А используется индекс при OR или нет уже станет не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 02:13 |
|
||
|
INNER JOIN по условию с OR
|
|||
|---|---|---|---|
|
#18+
слухай сюды. Индекс используется, чтобы ограничивать область поиска нужного значения. Скажем, если мы знаем, что opa.id2='1', то индекс сообщает, что можно смотреть в первых трёх строчках, а в остальные даже не соваться, если нам требуется найти opa.id2='3', то индекс скажет сразу идти к пятой строчке. Теперь смотри, когда ты делаешь opa INNER JOIN xex ON (opa.id1 = xex.symbol OR opa.id2 = xex.symbol), ты(вернее мускуль) берёшь первый xex.symbol и по индексу на opa.id1 очень быстро находишь требуемые значения opa.id1 = xex.symbol, то же самое происходит во втором сравнении, потом берёшь второй xex.symbol и так далее. В данном случае упускать из рассмотрения какое-то значение xex.symbol абсолютно некорректно. Потому что если мы не будем рассматривать значение, скажем, xex.symbol='2', то практически наверняка упустим записи, которые должны войти в результат(для '2' это вторая и червёртая строки в opa). Идекс служит для упускания некоторых записей из рассмотрения. Вот и подумай какие значения xex.symbol должны упускаться при накладывании условия (opa.id1 = xex.symbol OR opa.id2 = xex.symbol)? Другое дело, если count(opa.id1)+count(opa.id2) < count(xex.symbol). В этом случае может оказаться выгоднее перебирать строки opa, а сравнение делать по индексу по xex.symbol. Для этого есть FORCE INDEX. Тебе просто надо выяснить, что будет дешевле перебрать - строки opa и xex. Но что-то перебирать придётся точно. ma X mo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2004, 17:17 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=32798835&tid=1854580]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 461ms |

| 0 / 0 |
