mysql одной таблицы запрос SELECT ORDER BY вызывает FILESORT - PullRequest
3 голосов
/ 17 июня 2011

Я просмотрел несколько похожих постов, пытаясь получить информацию о том, как переопределить мой индекс, но не могу понять это.Каждый раз, когда я включаю оператор ORDER BY, он использует файловую сортировку для возврата набора результатов.

Вот определение таблицы и запрос:

SELECT
    `s`.`title`,
    `s`.`price`,
    `s`.`price_sale`
  FROM `style` `s`
 WHERE `s`.`isactive`=1 AND `s`.`department`='women' 
  ORDER
     BY `s`.`ctime` DESC



CREATE TABLE IF NOT EXISTS `style` (
    `id` mediumint(6) unsigned NOT NULL auto_increment,
    `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP,
    `department` char(5)  NOT NULL,
    `isactive` tinyint(1) unsigned NOT NULL,
    `price` float(8,2) unsigned NOT NULL,
    `price_sale` float(8,2) unsigned NOT NULL,
    `title` varchar(200) NOT NULL,
    PRIMARY KEY  (`id`),
    KEY `idx_grid_default` (`isactive`,`department`,`ctime`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=47 ;

Кроме того, вот набор результатов объяснения, который я получаю:

+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref         | rows | Extra                       |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+
|  1 | SIMPLE      | s     | ref  | idx_grid      | idx_grid | 6       | const,const |    3 | Using where; Using filesort |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Почему s.isactive не используется в качестве индекса?

MySQL (или любой SQL в этом отношении) не будет использовать ключ, если он имеет низкое количество элементов.Говоря простым языком, если многие строки имеют одно и то же значение для ключа, (My) SQL не будет использовать индекс, а будет просто использовать реальную таблицу.

Булево поле почти никогда не выбирается в качестве индекса из-за этого;слишком много строк имеют одно и то же значение.

Почему MySQL не использует индекс для ctime?

ctime включено в мультиполе или compositeиндекс.MySQL будет использовать только составной индекс , если вы используете все это или самую левую его часть *)
Если вы сортируете по среднему или самому правому полю (полям)составного индекса, MySQL не может использовать индекс и должен будет использовать сортировку файлов.
Таким образом, order by isactive , department будет использовать индекс;
order by department не будет.
order by isactive будет также не используйте индекс, но это потому, что количество элементов логического поля isactive слишком мало.

*) есть некоторые исключения, но это охватывает 97% случаев.

Ссылки:
Количество элементов википедии: http://en.wikipedia.org/wiki/Cardinality_%28data_modeling%29
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

1 голос
/ 18 июня 2011

Что означает использование файловой сортировки в MySQL?

Это не означает, что у вас есть временный файл, это просто означает, что сортировка выполнена (плохое имя, игнорируйте 4 первые буквы).

из Барон Шварц :

По правде говоря, файловая сортировка имеет плохое имя.В любое время сортировка не может быть выполнена из индекса, это сортировка файлов.Это не имеет ничего общего с файлами.Файловая сортировка должна называться «сортировка». Это быстрая сортировка в душе.

...