Это не решено, но я выяснил, почему: представление MySQL, содержащее UNION, плохо оптимизируется... Другими словами, МЕДЛЕННО!
Исходный пост:
Я работаю с базой данных для игры. Есть две одинаковые таблицы equipment
и safety_dep_box
. Чтобы проверить, есть ли у игрока предмет снаряжения, я хотел бы проверить обе таблицы.
Вместо выполнения двух запросов я хочу воспользоваться функциональностью UNION в MySQL. Недавно я узнал, что могу создать VIEW. Вот мой взгляд:
CREATE VIEW vAllEquip AS SELECT * FROM equipment UNION SELECT * FROM safety_dep_box;
Вид создан просто отлично. Однако, когда я бегу
SELECT * FROM vAllEquip WHERE owner=<id>
Запрос занимает вечность, в то время как независимые запросы на выборку выполняются быстро. Кажется, я знаю, почему, но я не знаю, как это исправить.
Спасибо!
P.S. с дополнительной информацией:
Две таблицы идентичны по структуре, но разделены, поскольку представляют собой таблицы с несколькими 100 миллионами строк. Структура включает в себя первичный ключ по идентификатору int, множественный индекс по владельцу int. Чего я не понимаю, так это разницы в скорости между следующим:
SELECT COUNT(*) FROM (SELECT * FROM equipment WHERE owner=1 UNION ALL SELECT * FROM safety_dep_box WHERE owner=1) AS uES;
0,42 сек.
SELECT COUNT(*) FROM (SELECT * FROM equipment WHERE owner=1 UNION SELECT * FROM safety_dep_box WHERE owner=1) AS uES;
0,37 сек.
SELECT COUNT(*) FROM vAllEquip WHERE owner=1;
прервано через 60 секунд
Версия: 5.1.51
mysql> explain SELECT * FROM equipment UNION SELECT * FROM safety_dep_box;
+----+--------------+----------------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+----------------+------+---------------+------+---------+------+---------+-------+
| 1 | PRIMARY | equipment | ALL | NULL | NULL | NULL | NULL | 1499148 | |
| 2 | UNION | safety_dep_box | ALL | NULL | NULL | NULL | NULL | 867321 | |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+----------------+------+---------------+------+---------+------+---------+-------+
с предложением WHERE
mysql> explain SELECT * FROM equipment WHERE owner=1 UNION ALL SELECT * FROM safety_dep_box WHERE owner=1
-> ;
+----+--------------+----------------+------+-----------------------+-------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+----------------+------+-----------------------+-------+---------+-------+------+-------+
| 1 | PRIMARY | equipment | ref | owner,owner_2,owner_3 | owner | 4 | const | 1 | |
| 2 | UNION | safety_dep_box | ref | owner,owner_3 | owner | 4 | const | 1 | |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+----------------+------+-----------------------+-------+---------+-------+------+-------+