Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Возможны ли многотабличные запросы к большим таблицам?
 
 автор: Eugene77   (08.11.2009 в 07:28)   письмо автору
 
 

Таблицы MyISAM примерно по 80М, столбцы, принимающие участие в запросе проиндексированы,
Но когда я пишу запрос к двум таблицам типа:
SELECT * FROM t1, t1 WHERE t1.f1=t2.f1 AND t2.f2 IN(......);
он занимает больше минуты.

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

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

  Ответить  
 
 автор: Trianon   (08.11.2009 в 11:04)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Eugene77   (08.11.2009 в 12:22)   письмо автору
 
   для: Trianon   (08.11.2009 в 11:04)
 

>Вроде как где-то в мануале по MySQL написано, что запрос с условием IN (SELECT ...) преобразуется в сложный коррелированный запрос, ничего хорошего в плане оптимизации не сулящий.
>


Это я уже осознал.
Поэтому внутри IN(Простой список через запятую)
Так что не в этом дело.
А в чём ещё - посоветуйте куда смотреть...

  Ответить  
 
 автор: Eugene77   (08.11.2009 в 12:42)   письмо автору
 
   для: 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


Но я затрудняюсь сделать из этого вывод необходимый для оптимизации.

  Ответить  
 
 автор: Eugene77   (08.11.2009 в 13:08)   письмо автору
 
   для: 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.


Это вроде бы не совсем то. Быстрее было бы найти все строки удовлетворяющие одному условию, а потом искать по другой таблице. Только как это пояснить в запросе?

  Ответить  
 
 автор: Eugene77   (08.11.2009 в 14:35)   письмо автору
 
   для: Trianon   (08.11.2009 в 11:04)
 

Что же мне делать?!
Если запрос разделить на два, то они отрабатываются за две-три тысячных доли секунды каждый.
А двухтабличный запрос 70 секунд работает.

Может быть результаты первого запроса присвоить какой-то переменной, а потом её будет использовать второй запрос?
Возможно такое в MySQL?
Какой синтаксис, если возможно?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования