优化表MySQL

时间:2014-10-15 12:19:14

标签: mysql sql

我有一个在35s内执行的查询,这个问题太长了。

以下是查询所关注的3个表(每个表长约13000行,将来应该更长):

表1:域名

CREATE TABLE IF NOT EXISTS `domain` (
  `id_domain` int(11) NOT NULL AUTO_INCREMENT,
  `domain_domain` varchar(255) NOT NULL,
  `projet_domain` int(11) NOT NULL,
  `date_crea_domain` int(11) NOT NULL,
  `date_expi_domain` int(11) NOT NULL,
  `active_domain` tinyint(1) NOT NULL,
  `remarques_domain` text NOT NULL,
  PRIMARY KEY (`id_domain`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

表2:关键字

CREATE TABLE IF NOT EXISTS `kw` (
  `id_kw` int(11) NOT NULL AUTO_INCREMENT,
  `kw_kw` varchar(255) NOT NULL,
  `clics_kw` int(11) NOT NULL,
  `cpc_kw` float(11,3) NOT NULL,
  `date_kw` int(11) NOT NULL,
  PRIMARY KEY (`id_kw`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

表3:域名和关键字之间的链接

CREATE TABLE IF NOT EXISTS `kw_domain` (
  `id_kd` int(11) NOT NULL AUTO_INCREMENT,
  `kw_kd` int(11) NOT NULL,
  `domain_kd` int(11) NOT NULL,
  `selected_kd` tinyint(1) NOT NULL,
  PRIMARY KEY (`id_kd`),
  KEY `kw_to_domain` (`kw_kd`,`domain_kd`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

查询如下:

SELECT ng.*, kd.*, kg.*
FROM domain ng
    LEFT JOIN kw_domain kd ON kd.domain_kd = ng.id_domain
    LEFT JOIN kw kg ON kg.id_kw = kd.kw_kd
GROUP BY ng.id_domain 
ORDER BY kd.selected_kd DESC, kd.id_kd DESC 

基本上,它选择所有域,对于每个域,使用最后一个关联的关键字。

有没有人知道如何优化表格或查询?

1 个答案:

答案 0 :(得分:1)

根据您的逻辑,以下内容将获取最后一个关键字:

select ng.*,
       (select kw_kd
        from kw_domain kd
        where kd.domain_kd = ng.id_domain and kd.selected_kd = 1
        order by kd.id_kd desc
        limit 1
       ) as kw_kd
from domain ng;

对于性能,您需要kw_domain(domain_kd, selected_kd, kw_kd)上的索引。在这种情况下,字段的顺序很重要。

您可以将其用作子查询以获取有关关键字的更多信息:

select ng.*, kg.*
from (select ng.*,
             (select kw_kd
              from kw_domain kd
              where kd.domain_kd = ng.id_domain and kd.selected_kd = 1
              order by kd.id_kd desc
              limit 1
             ) as kw_kd
      from domain ng
     ) ng left join
     kw kg
     on kg.id_kw = ng.kw_kd;

在MySQL中,group by可能性能较差,因此这可能会更好,特别是对于正确的索引。