У меня есть SQL-запрос, который очень долго выполняется на MySQL (это занимает несколько минут). Запрос выполняется к таблице с более чем 100 миллионами строк, поэтому я не удивлен, что он медленный. В теории, однако, должна быть возможность ускорить его, поскольку я действительно хочу получить только те строки из большой таблицы (назовем это A), которые имеют ссылку в другой таблице, B.
Итак, мой запрос:
SELECT id FROM A, B where A.ref = B.ref;
(у A более 100 миллионов строк; у B всего несколько тысяч).
Я добавил ИНДЕКСЫ:
alter table A add index(ref);
alter table B add index(ref);
Но это все еще очень медленно (несколько минут - я был бы счастлив с одной минутой).
К сожалению, я застрял с MySQL 4.1.22, поэтому не могу использовать представления.
Я бы предпочел не копировать все соответствующие строки из A в отдельную таблицу меньшего размера, поскольку нужные мне строки будут время от времени меняться. С другой стороны, на данный момент это единственное решение, которое я могу придумать.
Любые предложения приветствуются!
РЕДАКТИРОВАТЬ: Вот результат выполнения EXPLAIN для моего запроса:
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| 1 | SIMPLE | B | ALL | B_ref,ref | NULL | NULL | NULL | 16718 | Using where |
| 1 | SIMPLE | A | ref | A_REF,ref | A_ref | 4 | DATABASE.B.ref | 5655 | |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
(При редактировании моего исходного примера запроса я решил использовать «ref» в качестве имени столбца, которое совпадает с одним из типов, но, надеюсь, это не слишком смущает ...)