WHERE cascading clause inside VIEW with UNION

This is not resolved, but I found out why: MySQL. A view containing UNION is not optimized well ... In other words, SLOW!


Original post:

I work with a database for the game. There are two identical tables equipmentand safety_dep_box. To check if a player has a piece of equipment, I would like to check both tables.

Instead of making two queries, I want to use UNION functionality in MySQL. I recently found out that I can create VIEW. Here is my view:

CREATE VIEW vAllEquip AS SELECT * FROM equipment UNION SELECT * FROM safety_dep_box;

The created view is just fine. However, when I run

SELECT * FROM vAllEquip WHERE owner=<id>

The query is executed forever, while independent selection queries are fast. I think I know why, but I don't know how to fix it.

Thank!

PS with additional information:

, , 100 . int id, 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 |       |
+----+--------------+----------------+------+-----------------------+-------+---------+-------+------+-------+
+3
2

-, , , UNION ALL UNION. UNION . , .

-, , . , , .

-, , "*" SELECT. , . UNION, , , - , .

, " " , . , . , safe_dep_box ownerID itemID ( ) , , .

+2

-, SELECT * -. . -, , , .

, , , , . owner, .

0

Source: https://habr.com/ru/post/1773719/


All Articles