Оптимизация запроса MySql, чтобы избежать использования «Использование файловой сортировки» - PullRequest
3 голосов
/ 30 мая 2010

Мне нужна ваша помощь, чтобы оптимизировать запрос до , избегать использования «Использование сортировки файлов». Задача запроса - выбрать все статьи, относящиеся к определенному тегу. Запрос:

  select title 
    from tag,
         article 
   where tag = 'Riyad' 
     AND tag.article_id = article.id 
order by tag.article_id

Структура таблиц следующая:

Таблица тегов

 CREATE TABLE `tag` (
 `tag` VARCHAR( 30 ) NOT NULL ,
 `article_id` INT NOT NULL ,
 KEY `tag` (`tag`),
 KEY `article_id` (`article_id`)
 ) ENGINE = MYISAM ;

Таблица артикулов

 CREATE TABLE `article` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `title` VARCHAR( 60 ) NOT NULL
 ) ENGINE = MYISAM 

Пример данных

 INSERT INTO `article` VALUES (1, 'About Riyad');
 INSERT INTO `article` VALUES (2, 'About Newyork');
 INSERT INTO `article` VALUES (3, 'About Paris');
 INSERT INTO `article` VALUES (4, 'About London');

 INSERT INTO `tag` VALUES ('Riyad', 1);
 INSERT INTO `tag` VALUES ('Saudia', 1);
 INSERT INTO `tag` VALUES ('Newyork', 2);
 INSERT INTO `tag` VALUES ('USA', 2);
 INSERT INTO `tag` VALUES ('Paris', 3);
 INSERT INTO `tag` VALUES ('France', 3);

Ответы [ 2 ]

8 голосов
/ 30 мая 2010

В таблице tag заменить ключ на tag ключом на (tag, article_id):

ALTER TABLE `tag` DROP INDEX `tag`, ADD INDEX `tag_article_id` (`tag`, `article_id`)

MySQL будет использовать только один индекс таблицы для выполнения запроса. В настоящее время он использует индекс на tag, но не может использовать другой индекс для выполнения ORDER BY. Если вы поместите второй столбец в индекс, он будет использовать его для помощи с ORDER BY.

0 голосов
/ 30 мая 2010

Вы, частично, присоединяетесь к tag.article_id=article.id, но у вас нет индекса на стороне тега для его оптимальной поддержки. Добавьте вторичный (неуникальный) индекс для tag.article_id.

...