Fórum Root.cz
Hlavní témata => Server => Téma založeno: martyd420 23. 02. 2020, 12:22:49
-
Ahoj, přesouvám phpbb fórum z jednoho serveru na druhý.
Původní mysql je 5.5.62 a dotaz zde trvá 0.00 sec, na serveru kam to přesouvám je 5.7.28 a dotaz běží 5 minut.
Indexy jsem ručně kontroloval a na všech 5 tabulkách jsou nastavené stejně, přesto podle explain proběhnou dotazy jinak.
Podle toho explainu jsem koukal na ty indexy, ale nic jsem nenašel.. Nepoznáte někdo pls jaký problém hledat? Díky :)
Sql dotaz:
SELECT ug.user_id, a.forum_id, r.auth_setting, r.auth_option_id, ao.auth_option
FROM phpbb3_acl_groups a, phpbb3_user_group ug, phpbb3_groups g, phpbb3_acl_roles_data r, phpbb3_acl_options ao
WHERE a.auth_role_id = r.role_id
AND r.auth_option_id = ao.auth_option_id
AND a.group_id = ug.group_id
AND g.group_id = ug.group_id
AND ug.user_pending = 0
AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
AND ao.auth_option = 'm_';
EXPLAIN MySQL 5.5.62
+----+-------------+-------+--------+-----------------------+--------------+---------+---------------------+-------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+--------+-----------------------+--------------+---------+---------------------+-------+----------+-------------+
| 1 | SIMPLE | ao | const | PRIMARY,auth_option | auth_option | 152 | const | 1 | 100.00 | |
| 1 | SIMPLE | r | ref | PRIMARY,ath_op_id | ath_op_id | 3 | const | 3 | 100.00 | |
| 1 | SIMPLE | a | ref | group_id,auth_role_id | auth_role_id | 3 | wareznet.r.role_id | 260 | 100.00 | |
| 1 | SIMPLE | g | eq_ref | PRIMARY | PRIMARY | 3 | wareznet.a.group_id | 1 | 100.00 | |
| 1 | SIMPLE | ug | ref | group_id,group_leader | group_id | 3 | wareznet.a.group_id | 25034 | 100.00 | Using where |
+----+-------------+-------+--------+-----------------------+--------------+---------+---------------------+-------+----------+-------------+
EXPLAIN MySQL 5.7.28
+----+-------------+-------+------------+--------+-----------------------+-------------+---------+-------------------------------+-------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+-----------------------+-------------+---------+-------------------------------+-------+----------+-------------+
| 1 | SIMPLE | ao | NULL | const | PRIMARY,auth_option | auth_option | 152 | const | 1 | 100.00 | NULL |
| 1 | SIMPLE | g | NULL | ALL | PRIMARY | NULL | NULL | NULL | 13 | 100.00 | NULL |
| 1 | SIMPLE | ug | NULL | ref | group_id,group_leader | group_id | 3 | wareznet.g.group_id | 25034 | 10.00 | Using where |
| 1 | SIMPLE | a | NULL | ref | group_id,auth_role_id | group_id | 3 | wareznet.g.group_id | 240 | 100.00 | NULL |
| 1 | SIMPLE | r | NULL | eq_ref | PRIMARY,ath_op_id | PRIMARY | 6 | wareznet.a.auth_role_id,const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+-----------------------+-------------+---------+-------------------------------+-------+----------+-------------+
-
nechce se mi studovat indexy a explain.
nejvice radku je v tabulce ug, tak tam je to treba co nejvic omezit.
vidim v sql:
AND a.group_id = ug.group_id
AND g.group_id = ug.group_id
z toho plyne, ze i "AND a.group_id = g.group_id", nezmensi tahle podminka dalsi prohledavani?
-
"AND a.group_id = g.group_id" - žádná změna
Nakonec ale vyřešeno...
Přidáním indexu na ug.user_pending a přehozením těch podmínek.
Tak prozatím mi stačí fakt, že to funguje a já se po 7 hodinách můžu zabývat něčím jiným..
Ale stejně, pokud bhy někdo věděl čím to je, byl bych rád za tip..
V původní databázi ten index není a jede to rychle.
-
Tak je možné že se mezi verzemi změnilo... ...jen hádám, proč může být jiný execution plan.
-
"Ale stejně, pokud bhy někdo věděl čím to je, byl bych rád za tip.."
Nemůžu si odpustit: je to tím, že používáš bastl zvaný MySQL :-) za těch 7 hodin bys to přepsal na postgres :-).
Ale jinak - zkusil jsi ANALYZE TABLE na ty tabulky?Nevyčteš něco z EXPLAIN EXTENDED?https://dev.mysql.com/doc/refman/5.6/en/explain-extended.html