优化MySQL表结构。建议需要

时间:2010-10-29 07:18:13

标签: mysql database-design optimization query-optimization

我有这些表结构,当它工作时,在某些SQL查询上使用EXPLAIN会给出'Using temporary;在其中一个表上使用filesort'。一旦表填充了数千个数据,这可能会妨碍性能。以下是系统的表格结构和说明。

CREATE TABLE IF NOT EXISTS `jobapp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fullname` varchar(50) NOT NULL,
  `icno` varchar(14) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `icno` (`icno`)
) ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `jobapplied` (
  `appid` int(11) NOT NULL,
  `jid` int(11) NOT NULL,
  `jobstatus` tinyint(1) NOT NULL,
  `timestamp` int(10) NOT NULL,
  KEY `jid` (`jid`),
  KEY `appid` (`appid`)
) ENGINE=MyISAM;

我试过的查询给出了上述陈述:

EXPLAIN SELECT japp.id, japp.fullname, japp.icno, japp.status, japped.jid, japped.jobstatus
FROM jobapp AS japp
INNER JOIN jobapplied AS japped ON japp.id = japped.appid
WHERE japped.jid = '85'
AND japped.jobstatus = '2'
AND japp.status = '2'
ORDER BY japp.`timestamp` DESC 

该系统用于招募新员工。注册开放后,数百名申请人将在一次注册。他们被允许选择5个不同的工作。稍后在注册会话结束时,管理员将逐个完成每项工作。我使用单个表(jobapplied)存储2个项目(申请人ID,工作ID)来记录谁应用了什么。这是引起上述陈述的表。我意识到这个表没有PRIMARY密钥,但我后来无法想出任何其他方式让管理员专门搜索已申请的工作。

关于如何优化表格的任何建议?

2 个答案:

答案 0 :(得分:1)

除了缺少的索引和其他人提到的主键之外。 。

  

这可能会妨碍表现   表中填充了数千个   数据

您似乎假设查询优化器将在具有数千行的表上使用相同的执行计划,就像在具有几行的表上一样。优化器不能那样工作。

唯一可靠的方法来告诉特定供应商的优化器如何在具有数千行的表上执行查询 - 这仍然是一个小表,并且可能很容易适合内存 - 是

  • 加载一个临时版本 数千行的数据库
  • “解释”您感兴趣的查询 在

FWIW,我这样运行的最后一次测试涉及近10亿行 - 大约20个表中每个大约有5000万行。该查询的执行计划 - 包括大约20个左外连接 - 与样本数据(仅几千行)有很大不同。

答案 1 :(得分:0)

您按jobapp.timestamp排序,但没有时间戳索引,因此需要使用tablesort(可能是临时的)尝试添加和索引时间戳到jobapp,比如KEY timid(timestamp,id)