【发布时间】:2013-12-16 11:34:53
【问题描述】:
我有一个带有名为 QuizMatches 的表的数据库。该表的结构如下:
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
主要问题似乎是数据库执行了全索引扫描。我尝试过使用不同的索引组合,但没有成功。
如果我对上述 SELECT 查询运行 EXPLAIN,我会收到以下信息:
id: 1
select_type: SIMPLE
table: 'QuizMatches'
type: index
possible_keys: NULL
key: 'LatestChangedIX'
key_len: 8
ref: NULL
rows: 10
Extra:
有没有办法像上面的例子一样针对这个数据库表优化 SELECTS?
【问题讨论】:
-
您显示的
SELECT及其EXPLAIN不会导致全表扫描。EXPLAIN命令的key和rows输出表明它正在使用索引。 -
这个解释对我来说看起来很干净,它使用 LatestChanged 索引来获取排序的行,并在找到其中的 10 行后立即结束。为什么你认为它不好?
-
据我了解,根据 EXPLAIN,它会进行全索引扫描吗?这真的有必要吗?有没有其他方法可以改进这个表和查询? mysql 服务器 100% 工作,这只是我每秒执行大约 10 次这样的选择。
标签: mysql database-optimization