Как установить индекс таблицы MySql, используя WHERE, RANGE и SORT? - PullRequest
1 голос
/ 28 января 2011

У меня есть таблица MySql и запрос, который я пытаюсь оптимизировать, и у меня есть несколько вопросов.

SELECT value FROM table WHERE userid=?userid AND date <= ?date AND deleted='False' ORDER BY date DESC LIMIT 1

Таблица:

CREATE TABLE `table` (
    `tableid` int(11) NOT NULL AUTO_INCREMENT,
    `userid` int(11) DEFAULT NULL,
    `value` double DEFAULT '0',
    `date` date DEFAULT NULL,
    `deleted` enum('False','True') DEFAULT 'False',
    PRIMARY KEY (`tableid`),
    KEY `userid_date` (`userid`)
) ENGINE=InnoDB;

Я получаю следующий результат EXPLAIN длязапрос:

id    select_type    table       type    possible_keys    key            key_len    ref    rows    Extra
1     SIMPLE         table       ref     userid_date      userid_date   5          const  4       Using where; Using filesort

Если я перейду на использование также даты в ключе userid_date (KEY userid_date (userid, date)), я получу следующий результат EXPLAIN:

id    select_type    table    type    possible_keys    key            key_len    ref    rows    Extra
1     SIMPLE         table    range   userid_date      userid_date  9          NULL   4       Using where

Это лучше, так как он не использует сортировку файлов, но кажется, что тип не так хорош, как при использовании только идентификатора пользователя в качестве ключа.Как бы вы установили индекс для таблицы и запроса, как это?Хорошо ли использовать тип даты в качестве индекса?

1 Ответ

0 голосов
/ 28 января 2011

Это лучше, так как не использует файловую сортировку

да, и еще один, где фильтр доступен в индексе.

Вы также можете подумать о добавлении удаленных (userid, deleted, date). Тем не менее, убедитесь, что сравнение равно перед столбцом, который вы используете для диапазона и порядка по выражению - иначе ваш сортировка вернется.

но похоже, что тип не так хорош, как при использовании только ID пользователя

почему? Я думаю, что ваш индекс будет достаточно хорошим. столбец deleted может не стоить и, возможно, просто тратить пространство. но это зависит от того, используют ли столбец другие запросы, и от того, какой показатель «Ложь» находится в вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...