У меня есть база данных с таблицей QuizMatches. Таблица имеет следующую структуру:Оценка производительности полного сканирования индекса в базе данных mysql
CREATE TABLE `QuizMatches` (
`QuizMatchesGuid` binary(16) NOT NULL,
`DateStarted` datetime NOT NULL,
`LatestChanged` datetime NOT NULL,
`HostFBUserToken` varchar(250) NOT NULL,
`GuestFBUserToken` varchar(250) NOT NULL,
`ArrayOfQuestionIDs` varchar(200) NOT NULL,
`ArrayOfQuestionResponseTimesAndAnswersHost` varchar(900) NOT NULL,
`ArrayOfQuestionResponseTimesAndAnswersGuest` varchar(900) NOT NULL,
`MatchFinished` int(1) NOT NULL DEFAULT '0',
`Category` varchar(45) NOT NULL,
`JsonQuestions` varchar(4000) NOT NULL DEFAULT '[]',
`DateFinished` datetime NOT NULL,
`LatestPushSentDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`QuizMatchesGuid`),
KEY `HostFBUserTokenIX` (`HostFBUserToken`),
KEY `GuestFBUserTokenIX` (`GuestFBUserToken`),
KEY `MatchFinishedIX` (`MatchFinished`),
KEY `LatestChangedIX` (`LatestChanged`),
KEY `LatestPushSentDateIX` (`LatestPushSentDate`),
KEY `DateFinishedIX` (`LatestChanged`,`HostFBUserToken`,`GuestFBUserToken`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Там есть большое количество строк в этой таблице, и это в значительной степени используется несколькими клиентами, особенно запросы, как следующее выполняются:
SELECT HEX(QuizMatchesGuid) AS QuizMatchesGuid, DateStarted,
LatestChanged, HostFBUserToken, GuestFBUserToken,
ArrayOfQuestionIDs, ArrayOfQuestionResponseTimesAndAnswersHost,
ArrayOfQuestionResponseTimesAndAnswersGuest, JsonQuestions
FROM CrystalDBQuiz.QuizMatches
ORDER BY LatestChanged DESC
LIMIT 10
Основная проблема похоже, что база данных выполняет полное сканирование индекса. Я пробовал с различными комбинациями индексов, но не имел успеха.
Если я бегу EXPLAIN на выше SELECT, запрос я получаю следующее:
id: 1
select_type: SIMPLE
table: 'QuizMatches'
type: index
possible_keys: NULL
key: 'LatestChangedIX'
key_len: 8
ref: NULL
rows: 10
Extra:
Есть ли способ я могу оптимизировать ВЫБИРАЕТ в приведенном выше примере к этой таблице базы данных?
Выбранный SELECT, а его 'EXPLAIN', не приводит к полному сканированию таблицы. Вывод 'key' и' rows' команды 'EXPLAIN' показывает, что он использует индекс. –
Это объясняет мне чистоту, он использует индекс NewChanged для сортировки строк и заканчивается, как только 10 из них будут найдены. Почему вы думаете, что это плохо? – piotrm
Как я понимаю, в соответствии с EXPLAIN он выполняет полное сканирование индекса? это действительно необходимо? Есть ли другой способ улучшить эту таблицу и запрос? Сервер mysql работает на 100%, и это просто, если я делаю около 10 из этих выборок в секунду. –