Как предотвратить полное сканирование таблицы при выполнении простого JOIN? - PullRequest
3 голосов
/ 30 июля 2009

У меня есть две таблицы, TableA и TableB:

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?

1 Ответ

2 голосов
/ 30 июля 2009

Runcible, ваш запрос может быть переписан. Вы всегда должны указывать свои условия JOIN в предложении ON, а не в 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) избыточным. Брось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...