|
|
|
| Таблицы MyISAM примерно по 80М, столбцы, принимающие участие в запросе проиндексированы,
Но когда я пишу запрос к двум таблицам типа:
SELECT * FROM t1, t1 WHERE t1.f1=t2.f1 AND t2.f2 IN(......);
он занимает больше минуты.
Это нормально? Или что-то я не так делаю?
В целом, хотелось бы спросить, есть ли такой тип многотабличных запросов, который выполняется быстро даже на больших таблицах. (Исходя из этого буду перепроектировать базу)
Поделитесь опытом, как проектировать базы, чтобы многотабличные запросы в их быстро работали. | |
|
|
|
|
|
|
|
для: Eugene77
(08.11.2009 в 07:28)
| | Вроде как где-то в мануале по MySQL написано, что запрос с условием IN (SELECT ...) преобразуется в сложный коррелированный запрос, ничего хорошего в плане оптимизации не сулящий.
http://dev.mysql.com/doc/refman/5.0/en/in-subquery-optimization.html
Но вообще, конечно, нужно смотреть план.
http://dev.mysql.com/doc/refman/5.0/en/using-explain.html | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2009 в 11:04)
| | >Вроде как где-то в мануале по MySQL написано, что запрос с условием IN (SELECT ...) преобразуется в сложный коррелированный запрос, ничего хорошего в плане оптимизации не сулящий.
>
Это я уже осознал.
Поэтому внутри IN(Простой список через запятую)
Так что не в этом дело.
А в чём ещё - посоветуйте куда смотреть... | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2009 в 11:04)
| | SQL-запрос:
EXPLAIN EXTENDED SELECT `pz_words`.`word` , count( `pz_words`.`word` ) AS times
FROM `pz_words` , words_initials
WHERE words_initials.k
IN (
'посетитель', 'открытому'
)
AND words_initials.k = `pz_words`.`word`
GROUP BY `pz_words`.`word`
|
Выдаёт:
i
d select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE pz_words index NULL word 82 NULL 2391112 Using index
1 SIMPLE words_initials ref k k 242 func 1 Using where; Using index
|
Но я затрудняюсь сделать из этого вывод необходимый для оптимизации. | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2009 в 11:04)
| |
MySQL resolves all joins using a single-sweep multi-join method. This means that MySQL reads a row from the first table, and then finds a matching row in the second table, the third table, and so on.
|
Это вроде бы не совсем то. Быстрее было бы найти все строки удовлетворяющие одному условию, а потом искать по другой таблице. Только как это пояснить в запросе? | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2009 в 11:04)
| | Что же мне делать?!
Если запрос разделить на два, то они отрабатываются за две-три тысячных доли секунды каждый.
А двухтабличный запрос 70 секунд работает.
Может быть результаты первого запроса присвоить какой-то переменной, а потом её будет использовать второй запрос?
Возможно такое в MySQL?
Какой синтаксис, если возможно? | |
|
|
|