Использование сортировки файлов для сортировки по столбцу даты и времени в MySQL

У меня есть таблица Cars с datetime (ДАТА) и бит (PUBLIC).

Теперь я хотел бы взять строки, упорядоченные по DATE и с PUBLIC = 1, поэтому я использую:

select
  c.*
from
  Cars c
WHERE 
   c.PUBLIC = 1
ORDER BY 
   DATE DESC

Но, к сожалению, когда я использую объяснить, чтобы увидеть, что происходит, у меня есть это:

1   SIMPLE  a   ALL     IDX_PUBLIC,DATE     NULL    NULL    NULL    103     Using where; Using filesort

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

Если я иду к индексам, у меня есть индекс на (PUBLIC, DATE) не уникальный.

Таблица определения:

CREATE TABLE IF NOT EXISTS `Cars` (
  `ID` int(11) NOT NULL auto_increment,
  `DATE` datetime NOT NULL,
  `PUBLIC` binary(1) NOT NULL default '0'
  PRIMARY KEY  (`ID`),
  KEY `IDX_PUBLIC` (`PUBLIC`),
  KEY `DATE` (`PUBLIC`,`DATE`)
) ENGINE=MyISAM  AUTO_INCREMENT=186 ;

2 ответа

Решение

Вам нужно иметь составной индекс на (public, date)

Сюда, MySQL будет фильтровать public и сортировать по date,

От твоего EXPLAIN Я вижу, что у вас нет составного индекса на (public, date),

Вместо этого у вас есть два разных индекса public и на date, По крайней мере, так их зовут IDX_PUBLIC а также DATE сказать.

Обновить:

Вы public колонка не является BIT, это BINARY(1), Это тип символов и использует сравнение символов.

При сравнении целых чисел с символами, MySQL преобразует последнее в первое, а не наоборот.

Эти запросы возвращают разные результаты:

CREATE TABLE t_binary (val BINARY(2) NOT NULL);

INSERT
INTO    t_binary
VALUES
(1),
(2),
(3),
(10);

SELECT  *
FROM    t_binary
WHERE   val <= 10;

---
1
2
3
10

SELECT  *
FROM    t_binary
WHERE   val <= '10';
---
1
10

Либо поменяй public столбец, чтобы быть bit или перепишите ваш запрос следующим образом:

SELECT  c.*
FROM    Cars c
WHERE   c.PUBLIC = '1'
ORDER BY 
        DATE DESC

сравнивать символы с символами, а не с целыми числами.

Если вы заказываете по дате, потребуется сортировка. Если индекса по дате нет, будет использована сортировка файлов. Единственный способ избавиться от этого - либо добавить индекс по дате, либо не выполнять заказ по.

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

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

Другие вопросы по тегам