2013-12-16 4 views
4

У меня есть база данных с таблицей 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: 

Есть ли способ я могу оптимизировать ВЫБИРАЕТ в приведенном выше примере к этой таблице базы данных?

Neor profiler screenshot

+0

Выбранный SELECT, а его 'EXPLAIN', не приводит к полному сканированию таблицы. Вывод 'key' и' rows' команды 'EXPLAIN' показывает, что он использует индекс. –

+0

Это объясняет мне чистоту, он использует индекс NewChanged для сортировки строк и заканчивается, как только 10 из них будут найдены. Почему вы думаете, что это плохо? – piotrm

+0

Как я понимаю, в соответствии с EXPLAIN он выполняет полное сканирование индекса? это действительно необходимо? Есть ли другой способ улучшить эту таблицу и запрос? Сервер mysql работает на 100%, и это просто, если я делаю около 10 из этих выборок в секунду. –

ответ

0

Если вы используете LIMIT заявления для пагинации я предлагаю вам использовать LatestChanged значение для этого из-за упорядочение. Таким образом, ваш запрос будет выглядеть так:

SELECT HEX(QuizMatchesGuid) AS QuizMatchesGuid, DateStarted, LatestChanged, 
HostFBUserToken, GuestFBUserToken, ArrayOfQuestionIDs, 
ArrayOfQuestionResponseTimesAndAnswersHost, 
ArrayOfQuestionResponseTimesAndAnswersGuest, JsonQuestions 
FROM CrystalDBQuiz.QuizMatches 
WHERE LatestChanged<[lastValue] 
ORDER BY LatestChanged DESC 
LIMIT 10 
+0

Спасибо, но это не для разбивки на страницы –

Смежные вопросы