Wordpress u nas też się nie skarży...
Jest to jedno zapytanie z phpBB, które z jakiegoś powodu zajmuje bardzo dużo czasu, a nie wydaje się nadmiernie skomplikowane.
Ponieważ objawy na MySQL 5.7 były jeszcze gorsze - wróciłem do MySQL 8.0.16.
Zmieniłem silnik bazy danych dla wszystkich tabel na InnoDB.
Zrobiłem analyze dla tabel.
Ograniczyłem (zobaczymy czy skutecznie) w kodzie wywoływanie funkcji, która generuje felerne zapytanie.
Na ten moment nie mam więcej pomysłów.
MySQL mysi wybierać jakiś bardzo niewydajny sposób przeliczania tego zapytania. Blokerem nie jest ani dysk, ani I/O - te w ogóle nie są zajęte podczas wykonywania zapytania. Główny proces mysqld w trakcie zjadania CPU siedzi głównie na futexach...
Jeśli ktoś ma pomysły, to jestem otwarty na propozycje co jeszcze można sprawdzić.
Szczegóły:
Polecenie:
Kod: Zaznacz cały
SELECT ug.user_id, a.forum_id, r.auth_setting, r.auth_option_id, ao.auth_option FROM phpbb_acl_groups a, phpbb_user_group ug, phpbb_groups g, phpbb_acl_roles_data r, phpbb_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_';
(...)
8 rows in set (12.00 sec)
Explain:
Kod: Zaznacz cały
explain SELECT ug.user_id, a.forum_id, r.auth_setting, r.auth_option_id, ao.auth_option FROM phpbb_acl_groups a, phpbb_user_group ug, phpbb_groups g, phpbb_acl_roles_data r, phpbb_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_';
+----+-------------+-------+------------+--------+-----------------------+-------------+---------+----------------------------+------+----------+-------------+
| 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 | Using index |
| 1 | SIMPLE | g | NULL | ALL | PRIMARY | NULL | NULL | NULL | 15 | 100.00 | NULL |
| 1 | SIMPLE | ug | NULL | ref | group_id,group_leader | group_id | 3 | forum.g.group_id | 4739 | 10.00 | Using where |
| 1 | SIMPLE | a | NULL | ref | group_id,auth_role_id | group_id | 3 | forum.g.group_id | 80 | 100.00 | NULL |
| 1 | SIMPLE | r | NULL | eq_ref | PRIMARY,ath_op_id | PRIMARY | 6 | forum.a.auth_role_id,const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+-----------------------+-------------+---------+----------------------------+------+----------+-------------+
5 rows in set, 1 warning (0.00 sec)
Profiling:
Kod: Zaznacz cały
show profile for query 1;
+--------------------------------+-----------+
| Status | Duration |
+--------------------------------+-----------+
| starting | 0.000850 |
| Executing hook on transaction | 0.000034 |
| starting | 0.000032 |
| checking permissions | 0.000034 |
| checking permissions | 0.000021 |
| checking permissions | 0.000012 |
| checking permissions | 0.000008 |
| checking permissions | 0.000045 |
| Opening tables | 0.000251 |
| init | 0.000054 |
| System lock | 0.000071 |
| optimizing | 0.000121 |
| statistics | 0.000392 |
| preparing | 0.000076 |
| executing | 0.000010 |
| Sending data | 11.990784 |
| end | 0.000070 |
| query end | 0.000025 |
| waiting for handler commit | 0.000046 |
| closing tables | 0.000036 |
| freeing items | 0.000081 |
| cleaning up | 0.000113 |
+--------------------------------+-----------+