Hello,
after another attempts to add several networks, we have noticed that during the performance issue we do full table SCAN.
MariaDB [neutron]> EXPLAIN SELECT networkrbacs.project_id AS networkrbacs_project_id, networkrbacs.id AS networkrbacs_id, networkrbacs.target_tenant AS networkrbacs_target_tenant, networkrbacs.action AS networkrbacs_action, networkrbacs.object_id AS networkrbacs_objec t_id, anon_1.networks_id AS anon_1_networks_id -> FROM (SELECT networks.id AS networks_id -> FROM networks LEFT OUTER JOIN networkrbacs ON networks.id = networkrbacs.object_id -> WHERE networkrbacs.action = 'access_as_external' AND networkrbacs.target_tenant = 'a9b0XXXXXXX' OR network rbacs.target_tenant = '*' OR networks.project_id = 'a9b0XXXXXXX' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs.target_tenant = 'a9b0XXXXXXX' OR networkrbacs.target_tenant = '*')) AS anon_1 INNER JOIN networkrba cs ON anon_1.networks_id = networkrbacs.object_id -> ; +------+-------------+--------------+--------+--------------------------------+-----------+---------+--------------------------------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra | +------+-------------+--------------+--------+--------------------------------+-----------+---------+--------------------------------+-------+-------------+ | 1 | SIMPLE | networkrbacs | ALL | object_id | NULL | NULL | NULL |22857 | | | 1 | SIMPLE | networks | eq_ref | PRIMARY,ix_networks_project_id | PRIMARY | 110 | neutron.networkrbacs.object_id |1 | | | 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networkrbacs.object_id |238 | Using where | +------+-------------+--------------+--------+--------------------------------+-----------+---------+--------------------------------+-------+-------------+
After removing some of them, it seems we're under a certain threshold and we do use the index again.
MariaDB [neutron]> EXPLAIN SELECT networkrbacs.project_id AS networkrbacs_project_id, networkrbacs.id AS networkrbacs_id, networkrbacs.target_tenant AS networkrbacs_target_tenant, networkrbacs.action AS networkrbacs_action, networkrbacs.object_id AS networkrbacs_object_id, anon_1.networks_id AS anon_1_networks_id -> FROM (SELECT networks.id AS networks_id -> FROM networks LEFT OUTER JOIN networkrbacs ON networks.id = networkrbacs.object_id -> WHERE networkrbacs.action = 'access_as_external' AND networkrbacs.target_tenant = 'a9b0XXXXXXX' OR networkrbacs.target_tenant = '*' OR networks.project_id = 'a9b0XXXXXXX' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs.target_tenant = 'a9b0XXXXXXX' OR networkrbacs.target_tenant = '*')) AS anon_1 INNER JOIN networkrbacs ON anon_1.networks_id = networkrbacs.object_id; +------+-------------+--------------+-------+--------------------------------+------------------------+---------+---------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+--------------+-------+--------------------------------+------------------------+---------+---------------------+------+-------------+ | 1 | SIMPLE | networks | index | PRIMARY,ix_networks_project_id | ix_networks_project_id | 770 | NULL | 74 | Using index | | 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 238 | Using where | | 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 238 | | +------+-------------+--------------+-------+--------------------------------+------------------------+---------+---------------------+------+-------------+ 3 rows in set (0.000 sec)
PS: IDs have been anonymized.
Hope it helps.
Hello,
after another attempts to add several networks, we have noticed that during the performance issue we do full table SCAN.
MariaDB [neutron]> EXPLAIN SELECT networkrbacs. project_ id AS networkrbacs_ project_ id, networkrbacs.id AS networkrbacs_id, networkrbacs. target_ tenant AS networkrbacs_ target_ tenant, networkrbacs.action AS networkrbacs_ action, networkrbacs. object_ id AS networkrbacs_objec t_id, anon_1.networks_id AS anon_1_networks_id object_ id as_external' AND networkrbacs. target_ tenant = 'a9b0XXXXXXX' OR network rbacs.target_tenant = '*' OR networks.project_id = 'a9b0XXXXXXX' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs. target_ tenant = 'a9b0XXXXXXX' OR networkrbacs. target_ tenant = '*')) AS anon_1 INNER JOIN networkrba cs ON anon_1.networks_id = networkrbacs. object_ id +------ ------- +------ ------- -+----- ---+--- ------- ------- ------- ------- -+----- ------+ ------- --+---- ------- ------- ------- ------- +------ -+----- ------- -+ +------ ------- +------ ------- -+----- ---+--- ------- ------- ------- ------- -+----- ------+ ------- --+---- ------- ------- ------- ------- +------ -+----- ------- -+ ix_networks_ project_ id | PRIMARY | 110 | neutron. networkrbacs. object_ id |1 | | networkrbacs. object_ id |238 | Using where | +------ ------- +------ ------- -+----- ---+--- ------- ------- ------- ------- -+----- ------+ ------- --+---- ------- ------- ------- ------- +------ -+----- ------- -+
-> FROM (SELECT networks.id AS networks_id
-> FROM networks LEFT OUTER JOIN networkrbacs ON networks.id = networkrbacs.
-> WHERE networkrbacs.action = 'access_
-> ;
+------
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+------
| 1 | SIMPLE | networkrbacs | ALL | object_id | NULL | NULL | NULL |22857 | |
| 1 | SIMPLE | networks | eq_ref | PRIMARY,
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.
+------
After removing some of them, it seems we're under a certain threshold and we do use the index again.
MariaDB [neutron]> EXPLAIN SELECT networkrbacs. project_ id AS networkrbacs_ project_ id, networkrbacs.id AS networkrbacs_id, networkrbacs. target_ tenant AS networkrbacs_ target_ tenant, networkrbacs.action AS networkrbacs_ action, networkrbacs. object_ id AS networkrbacs_ object_ id, anon_1.networks_id AS anon_1_networks_id object_ id as_external' AND networkrbacs. target_ tenant = 'a9b0XXXXXXX' OR networkrbacs. target_ tenant = '*' OR networks.project_id = 'a9b0XXXXXXX' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs. target_ tenant = 'a9b0XXXXXXX' OR networkrbacs. target_ tenant = '*')) AS anon_1 INNER JOIN networkrbacs ON anon_1.networks_id = networkrbacs. object_ id; +------ ------- +------ ------- -+----- --+---- ------- ------- ------- ------- +------ ------- ------- ----+-- ------- +------ ------- ------- -+----- -+----- ------- -+ +------ ------- +------ ------- -+----- --+---- ------- ------- ------- ------- +------ ------- ------- ----+-- ------- +------ ------- ------- -+----- -+----- ------- -+ ix_networks_ project_ id | ix_networks_ project_ id | 770 | NULL | 74 | Using index | +------ ------- +------ ------- -+----- --+---- ------- ------- ------- ------- +------ ------- ------- ----+-- ------- +------ ------- ------- -+----- -+----- ------- -+
-> FROM (SELECT networks.id AS networks_id
-> FROM networks LEFT OUTER JOIN networkrbacs ON networks.id = networkrbacs.
-> WHERE networkrbacs.action = 'access_
+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------
| 1 | SIMPLE | networks | index | PRIMARY,
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 238 | Using where |
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 238 | |
+------
3 rows in set (0.000 sec)
PS: IDs have been anonymized.
Hope it helps.