2010-10-29 159 views
1

我有这些表结构,虽然它的工作,使用某些SQL查询EXPLAIN给'使用临时;在其中一个表上使用“filesort”。一旦表填充了数千个数据,这可能会妨碍性能。以下是该系统的表格结构和解释。优化MySQL表结构。需要建议

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键,但我以后无法找出任何其他方式让管理员专门搜索已申请的工作。

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

+0

为什么应用程序没有PRIMARY KEY? – 2010-10-29 07:24:31

+0

您能向我们展示EXPLAIN语句的结果吗?此外,请尽量避免使用字符串“2”,“85”的整数值所期望的类型转换。 – Vadim 2010-10-29 07:34:32

+0

下面是解释 - http://img180.imageshack.us/img180/5930/explain.jpg – exentric 2010-10-29 08:34:04

回答

0

你被jobapp.timestamp订购,但没有索引时间戳所以tablesort(也可能是暂时的),有必要尝试添加和指数时间戳jobapp像KEY胆小(时间戳,ID)

+0

这是正确的吗? “ALTER TABLE'jobapp' ADD INDEX('timestamp')”。虽然没有变化。 – exentric 2010-10-29 08:37:30

+0

你可以尝试ALTER TABLE jobapp ADD INDEX ja1(status,timestamp)和ALTER TABLE jobapplied ADD INDEX jad1(jid,jobstatus) – Jaydee 2010-10-29 09:44:01

1

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

一旦 表填充了数千个 数据,这可能会妨碍性能。

您似乎认为查询优化器将在具有数千行的表上使用相同的执行计划,因为它将在仅有几行的表上使用。优化器不能像那样工作。

唯一可靠的方式来告诉特定供应商的优化将如何对表执行查询与数千行 - 这仍然是一个小桌子,并可能轻松放置于内存 - 是

  • 负载 数据库与数千行的一个临时版本
  • ,“解释”查询你感兴趣的

FWIW,最后的测试我跑这样的涉及接近十亿行 - 大约20张桌子中的每一张大约有5000万美元。该查询的执行计划(包括大约20个左外连接)与示例数据(仅数千行)相比有很大不同。