相同的查询给出不同的“解释”输出

时间:2014-10-21 10:56:23

标签: innodb mysql-5.5

我有两个slave mysql db(5.5.27)(两个都在不同的机器上运行,操作系统相同)。

有三个表(CATEGORY_TREE,SEO_METADATA,TAGS)。

架构定义如下:

| CATEGORY_TREE | CREATE TABLE `CATEGORY_TREE` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `child_cid` int(11) DEFAULT NULL,
  `parent_cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `child_cid` (`child_cid`,`parent_cid`)
) ENGINE=InnoDB AUTO_INCREMENT=9528 DEFAULT CHARSET=latin1 |


| TAGS  | CREATE TABLE `TAGS` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `owner` varchar(20) DEFAULT NULL,
  `type` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`,`name`,`owner`,`type`)
) ENGINE=InnoDB AUTO_INCREMENT=165498 DEFAULT CHARSET=latin1 |



| SEO_METADATA | CREATE TABLE `SEO_METADATA` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `canonicalString` varchar(128) DEFAULT NULL,
  `dataId` varchar(20) DEFAULT NULL,
  `oldId` int(30) DEFAULT NULL,
  `type` varchar(1) DEFAULT NULL,
  `canonicalString` varchar(128) DEFAULT NULL,
  `searchString` text,
  PRIMARY KEY (`id`),
  KEY `id_type` (`dataId`,`type`),
  KEY `oldid_type` (`oldId`,`type`),
  KEY `canonicalstringidx` (`canonicalString`)
) ENGINE=InnoDB AUTO_INCREMENT=3863159 DEFAULT CHARSET=latin1 |

在跑步" EXPLAIN"对于选择数据库查询,我得到不同的输出

explain SELECT ct.child_cid AS 'tid', ct.parent_cid AS 'ptid', t.name, sm.canonicalString FROM CATEGORY_TREE ct, TAGS t, SEO_METADATA sm WHERE ct.child_cid = t.id AND sm.dataId = cast(ct.child_cid as char) AND sm.type = 't' AND (sm.searchString IS NULL OR sm.searchString = '') GROUP BY ct.child_cid LIMIT 10000;
**Machine 1**
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+
| id | select_type | table | type   | possible_keys | key       | key_len | ref                    | rows    | Extra                                        |
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | ct    | index  | child_cid     | child_cid | 10      | NULL                   |    2264 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | t     | eq_ref | PRIMARY,id    | PRIMARY   | 8       | cms.ct.child_cid |       1 | Using where                                  |
|  1 | SIMPLE      | sm    | ALL    | NULL          | NULL      | NULL    | NULL                   | 1588507 | Using where; Using join buffer               |
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+

**Machine 2**
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+
| id | select_type | table | type   | possible_keys | key       | key_len | ref                    | rows    | Extra                                        |
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | sm    | ALL    | NULL          | NULL      | NULL    | NULL                   | 1524208 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | ct    | index  | child_cid     | child_cid | 10      | NULL                   |    2500 | Using where; Using index; Using join buffer  |
|  1 | SIMPLE      | t     | eq_ref | PRIMARY,id    | PRIMARY   | 8       | cms.ct.child_cid |       1 | Using where                                  |
+----+-------------+-------+--------+---------------+-----------+---------+------------------------+---------+----------------------------------------------+

其中一个是使用" index"首先,但在其他情况下则不是。

我已经完成了#34; Why does the same exact query produce 2 different MySQL explain results?",并检查了@ spencer7593提到的所有参数。
除此之外,我已经运行"优化" Machine 2 DB中的table命令,但输出没有变化。


我知道mysql可以强迫"使用索引,但想知道相同的根本原因。

很少有人提到Innodb缓冲区大小也可能是不同输出的一个原因。就我而言,两者几乎相同。下面输出" SHOW ENGINE INNODB STATUS"来自两个db。

**Machine 1**
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 10989076480; in additional pool allocated 0
Dictionary memory allocated 5959814
Buffer pool size   655360
Free buffers       0
Database pages     645758

**Machine 2**
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 10989076480; in additional pool allocated 0
Dictionary memory allocated 5659318
Buffer pool size   655359
Free buffers       0
Database pages     645245

由于

0 个答案:

没有答案