2012-07-17 51 views
0

我有2个mysql服务器。 1节点是主节点,另一节点充当从节点,从主节点复制与查询优化器的奇怪mysql问题

2个节点具有相同的数据和模式。 然而,1次特定的查询被不同地从MySQL当两个节点

查询

EXPLAIN SELECT t.*, COUNT(h.id) 
         FROM tags t 
         INNER JOIN tags2articles s 
         ON t.id = s.tag_id 
         INNER JOIN tag_hits h 
         ON h.id = s.tag_id 
         INNER JOIN articles art 
         ON art.id = s.`article_id` 
         WHERE art.source_id IN (SELECT id FROM feeds WHERE source_id = 15074) 
         AND time_added > DATE_SUB(NOW(), INTERVAL 1 DAY) 
         AND t.type = '1' 
         GROUP BY t.id 
         HAVING COUNT(h.id) > 4 
         ORDER BY COUNT(h.id) DESC 
         LIMIT 15 

下面就运行为解释这两个节点上运行查询的outpout执行。请注意,主节点在主节点上

+----+--------------------+-------+-----------------+-----------------------------+---------------------+---------+----------------+--------+----------------------------------------------+ 
| id | select_type  | table | type   | possible_keys    | key     | key_len | ref   | rows | Extra          | 
+----+--------------------+-------+-----------------+-----------------------------+---------------------+---------+----------------+--------+----------------------------------------------+ 
| 1 | PRIMARY   | art | ALL    | PRIMARY      | NULL    | NULL | NULL   | 100270 | Using where; Using temporary; Using filesort | 
| 1 | PRIMARY   | s  | ref    | PRIMARY,FK_tags2articles | FK_tags2articles | 4  | art.id   |  12 | Using index         | 
| 1 | PRIMARY   | h  | ref    | tags_hits_idx    | tags_hits_idx  | 4  | s.tag_id  |  1 | Using index         | 
| 1 | PRIMARY   | t  | eq_ref   | PRIMARY,tags_type_idx  | PRIMARY    | 4  | s.tag_id  |  1 | Using where         | 
| 2 | DEPENDENT SUBQUERY | feeds | unique_subquery | PRIMARY,f_source_id_idx  | PRIMARY    | 4  | func   |  1 | Using where         | 
+----+--------------------+-------+-----------------+-----------------------------+---------------------+---------+----------------+--------+----------------------------------------------+ 

从节点输出上输出 正确的

输出

+ ---- + ---------- ---------- + ------- + ----------------- + ------------- ---------------- + ------------------ + --------- + ---- ---------------- + -------- + ------------------------ ----------------

------+ 
| id | select_type  | table | type   | possible_keys    | key    | key_len | ref    | rows | Extra          | 
+----+--------------------+-------+-----------------+-----------------------------+------------------+---------+--------------------+--------+----------------------------------------------+ 
| 1 | PRIMARY   | t  | ref    | PRIMARY,tags_type_idx  | tags_type_idx | 2  | const    | 206432 | Using where; Using temporary; Using filesort | 
| 1 | PRIMARY   | h  | ref    | tags_hits_idx    | tags_hits_idx | 4  | t.id    |  1 | Using index         | 
| 1 | PRIMARY   | s  | ref    | PRIMARY,FK_tags2articles | PRIMARY   | 4  | h.id    |  2 | Using where; Using index      | 
| 1 | PRIMARY   | art | eq_ref   | PRIMARY      | PRIMARY   | 4  | s.article_id  |  1 | Using where         | 
| 2 | DEPENDENT SUBQUERY | feeds | unique_subquery | PRIMARY,f_source_id_idx  | PRIMARY   | 4  | func    |  1 | Using where         | 
+----+--------------------+-------+-----------------+-----------------------------+------------------+---------+--------------------+--------+----------------------------------------------+ 

我不能了解这种差异存在的原因。任何帮助?

感谢

回答

1

他们可以有索引/键不同的统计和导致指数使用的差异。如果可能的话(锁定表,因此并不总是建议)对所有参与的表运行ANALYZE TABLE,然后查询计划可能相同。

+0

删除查询中涉及的多个表中的大量条目后,问题再次出现。我已经尝试过分析和优化表格,但是这次没有任何改变。有任何想法吗? – Thomas 2012-07-21 08:26:03

+0

实际上,我需要运行OPTIMIZE TABLE子句2到3次,才能更新统计信息并正确运行查询。令人讨厌的是,这需要定期完成,每次我删除大部分数据并且非常令人沮丧。 – Thomas 2012-08-16 08:20:34