Оптимизация моего запроса MySQL для использования индекса для сортировки - PullRequest
7 голосов
/ 17 июля 2009

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

explain select * from videos where public_private='public' and approved='yes' order by number_of_views desc;

+----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+
| id | select_type | table  | type | possible_keys                  | key  | key_len | ref  | rows    | Extra     |
+----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+
|  1 | SIMPLE      | videos | ALL  | approved,approved_3,approved_2 | NULL | NULL    | NULL | 1476818 | Using where; Using filesort |
+----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+

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

CREATE TABLE `videos` (
  `indexer` int(9) NOT NULL auto_increment,
  `user_id` int(9) default NULL,
  `public_private` varchar(24) default NULL,
  `approved` varchar(24) default NULL,
  `number_of_views` int(9) default NULL,
  PRIMARY KEY  (`indexer`),
  KEY `approved` (`approved`,`user_id`),
  KEY `approved_3` (`approved`,`public_private`,`indexer`),
  KEY `approved_2` (`approved`,`public_private`,`number_of_views`),
) ENGINE=MyISAM AUTO_INCREMENT=1969091 DEFAULT CHARSET=utf8 |

Что я должен сделать, чтобы MySQL использовал индекс для сортировки результатов?

Ответы [ 5 ]

13 голосов
/ 17 июля 2009

Я считаю, что ваш запрос, вероятно, соответствует большому проценту данных в таблице. В таких ситуациях оптимизатор MySQL часто выбирает сканирование таблицы и полностью игнорирует индексы, поскольку это на самом деле быстрее, чем при дополнительном чтении всего индекса и использовании его для извлечения данных. Так что в этом случае я предполагаю, что public_private='yes' and approved='yes' соответствует хорошей части вашего стола. Поэтому, если MySQL пропустит использование индекса из-за этого, он также не будет доступен для сортировки.

Если вы действительно хотите использовать индекс, то решение будет использовать FORCE INDEX:

select * from videos FORCE INDEX (approved_2) where public_private='public' and approved='yes' order by number_of_views desc;

Однако я бы запустил некоторые тесты, чтобы убедиться, что то, что вы получаете, действительно быстрее, чем то, что выбрал оптимизатор MySQL. По-видимому, у оптимизатора есть некоторые проблемы с выбором элементов для заказа, так что вы определенно можете попробовать и посмотреть, улучшите ли вы производительность.

1 голос
/ 17 июля 2009

Порядок имеет значение в композитных ключах. Если вы хотите отсортировать по number_of_views с помощью клавиши approved_2, измените:

KEY `approved_2` (`approved`,`public_private`,`number_of_views`)

до:

KEY `approved_2` (`number_of_views`,`approved`,`public_private`)

Составные ключи в MySQL работают слева направо. В приведенном выше примере ключ, объявленный с использованием number_of_views, approved и public_private implicity, создает индексы для:

  • number_of_views
  • number_of_views, approved
  • number_of_views, approved, public_private
0 голосов
/ 08 марта 2011

Это должно работать:

`select * from videos where approved='yes' and public_private='public' order by number_of_views desc;` 

Если это не так, просто создайте отдельный индекс для number_of_views.

Это должно работать.

(mysql в основном следует слева направо. Таким образом, ваш индекс на approved, public_private, number_of_views не будет работать, если не используется в этой последовательности. То есть вы можете использовать все три слева, 2 слева или самый левый 1. Но это не сработает, если вы не используете самый левый, вот в чем идея.)

Использование отдельного индекса приведет к автоматической сортировке number_of_views, это может помочь в order by - в этом я уверен.

0 голосов
/ 17 июля 2009

добавьте отдельный индекс в столбец number_of_views и посмотрите, работает ли он тогда.

Если ключ представляет собой комбинацию из 3 столбцов, он будет использовать этот конкретный ключ только тогда, когда он использует все 3 для выполнения операции

0 голосов
/ 17 июля 2009

Порядок имеет значение в составных ключах. Я забыл правила, но попробую в другом порядке.

...