【发布时间】:2011-05-02 06:37:51
【问题描述】:
我有这些表结构,虽然它可以工作,但在某些 SQL 查询上使用 EXPLAIN 会给出“使用临时;在其中一张桌子上使用文件排序。一旦表中填充了数千个数据,这可能会影响性能。下面是系统的表结构和说明。
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 键,但我以后想不出任何其他方法让管理员专门搜索申请的工作。
关于如何优化表格的任何建议?
【问题讨论】:
-
为什么jobapplied没有PRIMARY KEY?
-
您能告诉我们EXPLAIN语句的结果吗?另外,请尽量避免在预期整数值的地方使用字符串“2”、“85”的类型转换。
-
主键几乎总是必不可少的。此外,表上的一些索引将提高您的性能...
-
我明白了。然后我将添加主键。谢谢。
标签: mysql database-design optimization query-optimization