За последние 24 часа нас посетили 17607 программистов и 1617 роботов. Сейчас ищут 1925 программистов ...

Помогите исправить ошибку в объединение таблиц

Тема в разделе "MySQL", создана пользователем Natusik, 23 апр 2009.

  1. Natusik

    Natusik Активный пользователь

    С нами с:
    23 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    две таблицы 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
     
  2. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    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 сначала выбираем записи по жанру из основной таблицы. а только потом выбираем по связи.
     
  3. Natusik

    Natusik Активный пользователь

    С нами с:
    23 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    1. В big_books_n первичный ключ есть - 'id' но единственное поле, по которому можно объединить - это 'isbn_book'
    2. 'left join' - обязательно! нужны пустые значения. Обычное объединение проходит нормально, проблемы именно с 'left join' ;

    P.S. спасибо за совет, попробую вынести условие в 'WHERE';
     
  4. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Natusik

    есть такой инструмент:

    EXPLAIN текст запроса.
    далее см. параметр "type", если там ALL - это очень плохо.
    все объединения должны быть по индексированным полям.
     
  5. Natusik

    Natusik Активный пользователь

    С нами с:
    23 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    Нашла проблему, почему повисал комп, оказалась проблема в "ORDER BY";
    но и без него запрос выполняется 11 сек (поле 'isbn_book' в обеих таблицах проиндексировано).
    Можно ли как-нить уменьшить время выполнения запроса?
     
  6. Natusik

    Natusik Активный пользователь

    С нами с:
    23 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    да и весь запрос опять повесил комп
    Код (Text):
    1.  
    2. 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
    3.  
    4. FROM big_books_n LEFT JOIN books ON (big_books_n.isbn_book=books.isbn_book)
    5. WHERE big_books_n.id_genre = 2903
    6.  
    7. ORDER BY big_books_n.image DESC LIMIT 0, 12
     
  7. лол, текстовое поди?
     
  8. Natusik

    Natusik Активный пользователь

    С нами с:
    23 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    Нуда, а по другому никак (((