Два запроса таблицы: медленная сортировка файлов - PullRequest
0 голосов
/ 11 августа 2009

Я пытаюсь запросить последние записи в двух разных таблицах как один запрос:

SELECT
    news.title AS news_title,
    news.sid AS news_id,
    downloads.lid AS download_id,
    downloads.title AS download_title
FROM
    news,
    downloads
ORDER BY
    news_id DESC,
    download_id DESC
    LIMIT 0,10

Запрос действительно медленный, и он говорит "Using temporary; Using filesort", когда я делаю EXPLAIN. Каждая таблица имеет около 2000 предметов. Индекс первичного ключа каждой таблицы - это идентификатор (lid и sid).

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

У вас нет условия объединения, поэтому оно объединяет каждую строку в новостях с каждой строкой в ​​загрузках. Это называется перекрестным соединением или декартовым произведением. Таким образом, если в новостях 1000 строк, а в загрузках - 3000 строк, вы получите 3 миллиона возвращенных строк.

Вы, вероятно, хотите что-то вроде этого:

SELECT news.title AS news_title,
       news.sid AS news_id,
       downloads.lid AS download_id,
       downloads.title AS download_title
FROM news n
JOIN downloads d ON n.some_column = d.join_column /* fill this part in */
ORDER BY news_id DESC,download_id DESC LIMIT 0,10

По всей вероятности, один столбец соединения будет первичным ключом одного столбца, а внешним ключом - другим.

О, убедитесь, что внешний ключ тоже проиндексирован.

0 голосов
/ 11 августа 2009

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

Вы хотите добавить таблицу WHERE A.key = таблица b.field, чтобы присоединиться к ним.

Lance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...