【发布时间】:2012-06-20 12:12:04
【问题描述】:
我有一个包含 300 000 条记录的表 (MyISAM)。我用这个函数从这个表中获取记录:
public function loadRows() {
if (!$this->result)
die("Nothing found!");
$this->rows = array();
while ($r = mysql_fetch_array($this->result, MYSQL_ASSOC))
$this->rows[] = $r;
//mysql_free_result($this->result);
return $this->rows;
}
显示此表中的 100 条记录的估计时间为 6 秒,非常慢,此查询使用的 MEMORY 为 512 MB。我哪里错了?
查询是:
SELECT i.* FROM inv i
LEFT JOIN (inv_m im) ON (i.m_id = im.id)
LEFT JOIN (inv_f iff) ON (iff.num = i.num)
LEFT JOIN (temp_a ta) ON (ta.num = i.num)
WHERE i.vid = 1
AND iff.num IS NULL
AND ta.num IS NULL
LIMIT 100
对于 i.vid,我显示所有记录。
声明的索引:
i.m_id 索引
im.id 主键
iff.num 索引
i.num 索引
ta.num 索引
解释结果
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE i ref vid vid 4 const 85343 Using where
1 SIMPLE im eq_ref PRIMARY PRIMARY 4 checksys_r1.i.m_id 1
1 SIMPLE iff ref num num 182 checksys_r1.i.num 1 Using where
1 SIMPLE ta ref num num 194 checksys_r1.i.num 1 Using where
【问题讨论】:
-
您要加入四张桌子,但只谈论一张。发布有关您的架构的更多详细信息。
-
num字段是否已编入索引? -
如果您向
inv.num、inv_f.num和temp_a.num列添加索引,您应该会看到速度提高 -
请显示 EXPLAIN 结果。
-
所有这些列都是索引
标签: mysql