繁体   English   中英

优化mysql查询(SELECT)?

[英]Optimize mysql query (SELECT)?

我的表有30万条记录(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条记录的估计时间非常慢,并且此查询使用的内存为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 INDEX

im.id主键

iff.num INDEX

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

从运行开始:

EXPLAIN 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 / O等内容。在此处发布结果。 有时表也可能需要修复。

另外,您是否有理由在InnoDB上使用MyISAM?

有两种可能的原因,两者都有可能在起作用。 首先,请尽量避免选择*。 显式指定列将为您节省针对master数据库的每次联接查询,以一次又一次地查找列名称。 第二个是您要指定一个where子句,该子句仅在您加入后运行。 因此,它将使用所有联接创建一个庞大的记录集,然后再过滤该记录集。 将条件移到联接本身上可以使您获得更多的性能提升。 所以.....

SELECT i.Column1, i.Column2, i.Column3 
FROM inv i 
LEFT JOIN (inv_m im) ON (i.m_id = im.id AND i.vid = 1)
LEFT JOIN (inv_f iff) ON (iff.num = i.num AND iff.num IS NULL)
LEFT JOIN (temp_a ta) ON (ta.num = i.num AND ta.num IS NULL)
LIMIT 100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM