Как сделать так, чтобы запрос JOIN использовал индекс?

У меня есть две таблицы:

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(1000) DEFAULT NULL,
  `last_updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `last_updated` (`last_updated`),
) ENGINE=InnoDB AUTO_INCREMENT=799681 DEFAULT CHARSET=utf8 

CREATE TABLE `article_categories` (
  `article_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`article_id`,`category_id`),
  KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

Это мой запрос:

SELECT a.*
FROM
    articles AS a,
    article_categories AS c
WHERE
    a.id = c.article_id
    AND c.category_id = 78
    AND a.comment_cnt > 0
    AND a.deleted = 0
ORDER BY a.last_updated
LIMIT 100, 20

ИEXPLAIN для этого:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: a
         type: index
possible_keys: PRIMARY
          key: last_updated
      key_len: 9
          ref: NULL
         rows: 2040
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: c
         type: eq_ref
possible_keys: PRIMARY,fandom_id
          key: PRIMARY
      key_len: 8
          ref: db.a.id,const
         rows: 1
        Extra: Using index

Он использует полное сканирование индексаlast_updated на первой таблице для сортировки, но не использует индекс y для объединения (type: index в объяснение). Это очень плохо сказывается на производительности и убивает весь сервер базы данных, так как это очень частый запрос.

мы пытались изменить порядок таблиц сSTRAIGHT_JOIN, но это даетfilesort, using_temporary, что еще хуже.

Есть ли способ заставить MySQL использовать индекс для объединения и сортировки одновременно?

=== Обновить === Я '

м действительно отчаянно в этом. Может быть, какая-то денормализация может помочь здесь?

Ответы на вопрос(6)

Ваш ответ на вопрос