2009-07-29 5 views
3

私は2つのテーブル、テーブルAとテーブルBがあります。シンプルなJOINを実行しているときにテーブル全体をスキャンしないようにするにはどうすればよいですか?

CREATE TABLE `TableA` (
    `shared_id` int(10) unsigned NOT NULL default '0', 
    `foo` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`shared_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 


CREATE TABLE `TableB` (
    `shared_id` int(10) unsigned NOT NULL auto_increment, 
    `bar` int(10) unsigned NOT NULL, 
    KEY `shared_id` (`shared_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 

をここに私のクエリです:

SELECT TableB.bar 
FROM TableB, TableA 
WHERE TableA.foo = 1000 
AND TableA.shared_id = TableB.shared_id; 

は、ここで問題です:

mysql> explain SELECT TableB.bar FROM TableB, TableA WHERE TableA.foo = 1000 AND TableA.shared_id = TableB.shared_id; 

+----+-------------+--------------+--------+---------------+---------+---------+------------------------------------------+------+-------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref          | rows | Extra  | 
+----+-------------+--------------+--------+---------------+---------+---------+------------------------------------------+------+-------------+ 
| 1 | SIMPLE  | TableB  | ALL | shared_id  | NULL | NULL | NULL          | 1000 |    | 
| 1 | SIMPLE  | TableA  | eq_ref | PRIMARY  | PRIMARY | 4  | MyDatabase.TableB.shared_id    | 1 | Using where | 
+----+-------------+--------------+--------+---------------+---------+---------+------------------------------------------+------+-------------+ 

があります私が追加できるインデックスそれはTableBの完全なテーブルスキャンを防ぐでしょうか?

答えて

2

Runcible、あなたのクエリはいくつかの書き換えを使用する可能性があります。 ON節でJOIN条件を指定し、WHEREでは指定しないでください。

あなたのクエリになるでしょう:

SELECT TableB.bar 
FROM TableB 
JOIN TableA 
ON TableB.shared_id = TableA.shared_id 
AND TableA.foo = 1000; 

だけでなく、あなたがこれを行うにはしたくない:

ALTER TABLE TableB ADD INDEX (shared_id,bar); 

次のように、Aにインデックスを追加することをお勧めします:

ALTER TABLE TableA ADD INDEX (foo, shared_id); 

これを行い、EXPLAIN出力を提供してください。

また、(shared_id、bar)にインデックスを追加すると、(shared_id)インデックスが冗長になりました。もうやめろ。

+0

2番目のインデックスを追加すると、そのトリックが行われました。 @hobodave:助けてくれてありがとう! – Runcible

+0

@Runcibleは出力を説明しますか? – briankip

関連する問題