две таблицы big_books_n - 148 000 строк, books - 30 000 запрос вешает весь компьютер и на долго; без LEFT OUTER JOIN срабатывает моментально. SELECT big_books_n.id_book, big_books_n.isbn_book, books.price, big_books_n.title_book, big_books_n.author, big_books_n.image FROM big_books_n LEFT OUTER JOIN books ON big_books_n.isbn_book=books.isbn_book and big_books_n.id_genre=2903 ORDER BY big_books_n.image DESC LIMIT 0,12
1. Есть bbcode SQL, надо его использовать, тогда люди которые хотят помочь не будут ломать глаза вчитываясь в кашу. 2. Все AND из выражения ON надо вынести в WHERE: [sql]SELECT ... FROM big_books_n LEFT JOIN books ON (big_books_n.isbn_book = books.isbn_book) WHERE big_books_n.id_genre = 2903 ORDER BY big_books_n.image DESC LIMIT 0, 12[/sql] 3. Проставь индексы на big_books_n.isbn_book, books.isbn_book, big_books_n.id_genre и big_books_n.image. То есть на те вещи, которые участвуют в запросах. Индексы - сила. Непонятно, isbn_book в основной таблице не primary key? Лучше всего вести связь по ним или уникальным ключам, но это дольше потому что не цифры. 4. А надо ли left join? В случае left join присоеденяются таблицы с пустыми (null) значениями. В иных случаях они игнорируются и мы имеем меньше результатов для обработки: [sql]SELECT ... FROM big_books_n, books WHERE big_books_n.id_genre = 2903 and big_books_n.isbn_book = books.isbn_book ORDER BY big_books_n.image DESC LIMIT 0, 12[/sql] Тут inner join (запятая в from является синонимом синоним). В where сначала выбираем записи по жанру из основной таблицы. а только потом выбираем по связи.
1. В big_books_n первичный ключ есть - 'id' но единственное поле, по которому можно объединить - это 'isbn_book' 2. 'left join' - обязательно! нужны пустые значения. Обычное объединение проходит нормально, проблемы именно с 'left join' ; P.S. спасибо за совет, попробую вынести условие в 'WHERE';
Natusik есть такой инструмент: EXPLAIN текст запроса. далее см. параметр "type", если там ALL - это очень плохо. все объединения должны быть по индексированным полям.
Нашла проблему, почему повисал комп, оказалась проблема в "ORDER BY"; но и без него запрос выполняется 11 сек (поле 'isbn_book' в обеих таблицах проиндексировано). Можно ли как-нить уменьшить время выполнения запроса?
да и весь запрос опять повесил комп Код (Text): SELECT big_books_n.id_book, big_books_n.isbn_book, books.price, big_books_n.title_book, big_books_n.author, big_books_n.image FROM big_books_n LEFT JOIN books ON (big_books_n.isbn_book=books.isbn_book) WHERE big_books_n.id_genre = 2903 ORDER BY big_books_n.image DESC LIMIT 0, 12