【问题标题】:Optimizing MySQL table structure. Advice needed优化 MySQL 表结构。需要建议
【发布时间】: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


【解决方案1】:

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

这可能会影响性能,一旦 表中填充了数千个 数据。

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

判断特定供应商的优化器将如何对具有数千行的表执行查询的唯一可靠方法——该表仍然是一个小表,很可能很容易放入内存中——

  • 加载暂存版本的 包含数千行的数据库
  • “解释”你感兴趣的查询 在

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是正确的吗? “改变表jobapp添加索引(timestamp)”。不过没有变化。
    • 你可以试试 ALTER TABLE jobapp ADD INDEX ja1 ( status,timestamp ) 和 ALTER TABLE jobapplied ADD INDEX jad1 ( jid,jobstatus)
    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多