【问题标题】:Performance issue full index scan in mysql databasemysql数据库中的性能问题全索引扫描
【发布时间】: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 命令的 keyrows 输出表明它正在使用索引。
  • 这个解释对我来说看起来很干净,它使用 LatestChanged 索引来获取排序的行,并在找到其中的 10 行后立即结束。为什么你认为它不好?
  • 据我了解,根据 EXPLAIN,它会进行全索引扫描吗?这真的有必要吗?有没有其他方法可以改进这个表和查询? mysql 服务器 100% 工作,这只是我每秒执行大约 10 次这样的选择。

标签: mysql database-optimization


【解决方案1】:

如果您使用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

【讨论】:

  • 谢谢,但它不是用于分页
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2012-11-21
相关资源
最近更新 更多