【问题标题】:MySQL structure help for joins ( large tables)连接的 MySQL 结构帮助(大表)
【发布时间】:2009-12-10 15:11:25
【问题描述】:

我目前有 2 个表用于通过简单连接进行选择查询。第一个表包含大约 6-9 百万行,这被用作连接。主表的行数从 1 百万到 3 亿不等。但是,我注意到当我在主表上加入超过 1000 万行时,选择查询从即时变为非常慢(3 秒以上并且还在增长)。

这是我的表结构和查询。

CREATE TABLE IF NOT EXISTS `links` (
  `link_id` int(10) unsigned NOT NULL,
  `domain_id` mediumint(7) unsigned NOT NULL,
  `parent_id` int(11) unsigned DEFAULT NULL,
  `hash` int(10) unsigned NOT NULL,
  `url` text NOT NULL,
  `type` enum('html','pdf') DEFAULT NULL,
  `processed` enum('N','Y') NOT NULL DEFAULT 'N',
  UNIQUE KEY `hash` (`hash`),
  KEY `idx_processed` (`processed`),
  KEY `domain_id` (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;


CREATE TABLE IF NOT EXISTS `domains` (
  `domain_id` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(170) NOT NULL,
  `blocked` enum('N','Y') NOT NULL DEFAULT 'N',
  `count` mediumint(6) NOT NULL DEFAULT '0',
  `mcount` mediumint(3) NOT NULL,
  PRIMARY KEY (`domain_id`),
  KEY `name` (`name`),
  KEY `blocked` (`blocked`),
  KEY `mcount` (`mcount`),
  KEY `count` (`count`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10834389 ;

查询:

(SELECT link_id, url, hash FROM links, domains WHERE links.domain_id = domains.domain_id and mcount > 1 and processed='N' limit 200) 
UNION
(SELECT link_id, url, hash FROM links where processed='N' and type='html' limit 200)

解释选择:

| id | select_type  | table      | type  | possible_keys           | key      |     key_len | ref                       | rows    | Extra       |
+----+--------------+------------+-------+-------------------------+---------------        +---------+---------------------------+---------+-------------+
|  1 | PRIMARY      | domains    | range | PRIMARY,mcount          | mcount        | 3       | NULL                      |  257673 | Using where | 
|  1 | PRIMARY      | links      | ref   | idx_processed,domain_id | domain_id     | 3       | crawler.domains.domain_id |       1 | Using where | 
|  2 | UNION        | links      | ref   | idx_processed           | idx_processed | 1       | const                     | 7090017 | Using where | 
| NULL | UNION RESULT | <union1,2> | ALL   | NULL                    | NULL          | NULL    | NULL                      |    NULL |             | 
+----+--------------+------------+-------+-------------------------+---------------+---------+---------------------------+---------+-------------+

现在,我正在使用 domain_id 作为键的链接上尝试一个包含 20 个分区的分区。

任何其他选项将不胜感激。

【问题讨论】:

  • 这是第一个出现缓慢的查询,而不是第二个。我应该在之前提到过。对不起。
  • 您能否也描述一下您的索引,并在慢查询中显示哪些字段来自哪个表。

标签: mysql performance join


【解决方案1】:

单个 SELECT 语句将替换整个 UNION 语句:

SELECT link_id, url, hash
FROM links, domains 
WHERE links.domain_id = domains.domain_id 
      AND mcount > 1
      AND processed='N' 
      AND type='html'

这可能不是您正在寻找的答案,但它应该可以帮助您简化问题。

【讨论】:

    【解决方案2】:

    当事情突然变慢时,您可能需要检查索引的大小(用于查询执行)与各种 mysql 缓冲区的大小。

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 1970-01-01
      • 2011-07-22
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多