0

私は2つのmysqlサーバーを持っています。1つのノードはマスターであり、もう1つのノードはスレーブとして機能し、マスターから複製します。

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

以下は、両方のノードで実行されたEXPLAINクエリからの出力です。マスターノードが正しいノードを出力していることに注意してください

マスターノードでの出力

+----+--------------------+-------+-----------------+-----------------------------+---------------------+---------+----------------+--------+----------------------------------------------+
| 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                                  |
+----+--------------------+-------+-----------------+-----------------------------+------------------+---------+--------------------+--------+----------------------------------------------+

この不一致がなぜ存在するのか理解できません。何か助けはありますか?

ありがとう

4

1 に答える 1

1

それらはインデックス/キーに対して異なる統計を持つことができ、それがインデックスの使用法の違いを引き起こします。可能であれば(テーブルをロックするため、常に推奨されるわけではありません) 、参加しているすべてのテーブルに対してANALYZE TABLEを実行すると、クエリプランは同じになる可能性があります。

于 2012-07-17T07:01:40.687 に答える