after some searching on mariadb database tuning, we found that setting "join_cache_level = 3" on mariadb is speeding the query time by 5, but it still does a full table scan and consume 100% during the processing of the request.
Another clue is that index statistics values are not well updated in that case:
------------------------
MariaDB [nova]> select * from mysql.innodb_index_stats where table_name='networkrbacs';
+---------------+--------------+--------------------------------------------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name | index_name | last_update | stat_name | stat_value | sample_size | stat_description |
+---------------+--------------+--------------------------------------------------+---------------------+--------------+------------+-------------+-----------------------------------+
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | n_diff_pfx01 | 22865 | 267 | id |
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | size | 289 | NULL | Number of pages in the index |
| neutron | networkrbacs | ix_networkrbacs_project_id | 2021-05-07 15:32:09 | n_diff_pfx01 | 1 | 109 | project_id |
| neutron | networkrbacs | ix_networkrbacs_project_id | 2021-05-07 15:32:09 | n_diff_pfx02 | 22865 | 109 | project_id,id |
| neutron | networkrbacs | ix_networkrbacs_project_id | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | ix_networkrbacs_project_id | 2021-05-07 15:32:09 | size | 161 | NULL | Number of pages in the index |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_diff_pfx01 | 48 | 163 | object_id |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_diff_pfx02 | 22865 | 163 | object_id,id |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | size | 225 | NULL | Number of pages in the index |
| neutron | networkrbacs | uniq_networkrbacs0tenant_target0object_id0action | 2021-05-07 15:32:09 | n_diff_pfx01 | 1 | 255 | action |
| neutron | networkrbacs | uniq_networkrbacs0tenant_target0object_id0action | 2021-05-07 15:32:09 | n_diff_pfx02 | 48 | 255 | action,object_id |
| neutron | networkrbacs | uniq_networkrbacs0tenant_target0object_id0action | 2021-05-07 15:32:09 | n_diff_pfx03 | 22865 | 255 | action,object_id,target_tenant |
| neutron | networkrbacs | uniq_networkrbacs0tenant_target0object_id0action | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | uniq_networkrbacs0tenant_target0object_id0action | 2021-05-07 15:32:09 | size | 357 | NULL | Number of pages in the index |
+---------------+--------------+--------------------------------------------------+---------------------+--------------+------------+-------------+-----------------------------------+
16 rows in set (0.003 sec)
some stats are not well updated and we have tried to update them manually with the values of a count(*) from networks, project, or networkrbacs:
update mysql.innodb_index_stats set stat_value=22865 where table_name='networkrbacs' and stat_description in('object_id') and index_name='object_id';
or even
update mysql.innodb_index_stats set stat_value=2129 where table_name='networkrbacs' and stat_description in('action', 'object_id');
and the query is now using index:
MariaDB [neutron]> ANALYZE 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 = '3129fce5e6a2496c976e8ebc46409ba8' OR networkrbacs.target_tenant = '*' OR networks.project_id = '3129fce5e6a2496c976e8ebc46409ba8' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs.target_tenant = '3129fce5e6a2496c976e8ebc46409ba8' 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 | r_rows | filtered | r_filtered | Extra |
+------+-------------+--------------+-------+--------------------------------+------------------------+---------+---------------------+------+--------+----------+------------+-------------+
| 1 | SIMPLE | networks | index | PRIMARY,ix_networks_project_id | ix_networks_project_id | 770 | NULL | 107 | 107.00 | 100.00 | 100.00 | Using index |
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 1 | 213.69 | 100.00 | 0.36 | Using where |
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 1 | 571.69 | 100.00 | 100.00 | |
+------+-------------+--------------+-------+--------------------------------+------------------------+---------+---------------------+------+--------+----------+------------+-------------+
3 rows in set (0.071 sec)
Can you explain your issue on your side ? Did you force the index name to use in that name in sqlalchemy or neutron-lib ?
Hi Tyler,
after some searching on mariadb database tuning, we found that setting "join_cache_level = 3" on mariadb is speeding the query time by 5, but it still does a full table scan and consume 100% during the processing of the request.
Another clue is that index statistics values are not well updated in that case:
------- ------- ------- --- index_stats where table_name= 'networkrbacs' ; ------- --+---- ------- ---+--- ------- ------- ------- ------- ------- ------- -----+- ------- ------- ------+ ------- ------- +------ ------+ ------- ------+ ------- ------- ------- ------- ------- + ------- --+---- ------- ---+--- ------- ------- ------- ------- ------- ------- -----+- ------- ------- ------+ ------- ------- +------ ------+ ------- ------+ ------- ------- ------- ------- ------- + _project_ id | 2021-05-07 15:32:09 | n_diff_pfx01 | 1 | 109 | project_id | _project_ id | 2021-05-07 15:32:09 | n_diff_pfx02 | 22865 | 109 | project_id,id | _project_ id | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index | _project_ id | 2021-05-07 15:32:09 | size | 161 | NULL | Number of pages in the index | cs0tenant_ target0object_ id0action | 2021-05-07 15:32:09 | n_diff_pfx01 | 1 | 255 | action | cs0tenant_ target0object_ id0action | 2021-05-07 15:32:09 | n_diff_pfx02 | 48 | 255 | action,object_id | cs0tenant_ target0object_ id0action | 2021-05-07 15:32:09 | n_diff_pfx03 | 22865 | 255 | action, object_ id,target_ tenant | cs0tenant_ target0object_ id0action | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index | cs0tenant_ target0object_ id0action | 2021-05-07 15:32:09 | size | 357 | NULL | Number of pages in the index | ------- --+---- ------- ---+--- ------- ------- ------- ------- ------- ------- -----+- ------- ------- ------+ ------- ------- +------ ------+ ------- ------+ ------- ------- ------- ------- ------- +
MariaDB [nova]> select * from mysql.innodb_
+------
| database_name | table_name | index_name | last_update | stat_name | stat_value | sample_size | stat_description |
+------
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | n_diff_pfx01 | 22865 | 267 | id |
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | PRIMARY | 2021-05-07 15:32:09 | size | 289 | NULL | Number of pages in the index |
| neutron | networkrbacs | ix_networkrbacs
| neutron | networkrbacs | ix_networkrbacs
| neutron | networkrbacs | ix_networkrbacs
| neutron | networkrbacs | ix_networkrbacs
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_diff_pfx01 | 48 | 163 | object_id |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_diff_pfx02 | 22865 | 163 | object_id,id |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| neutron | networkrbacs | object_id | 2021-05-07 15:32:09 | size | 225 | NULL | Number of pages in the index |
| neutron | networkrbacs | uniq_networkrba
| neutron | networkrbacs | uniq_networkrba
| neutron | networkrbacs | uniq_networkrba
| neutron | networkrbacs | uniq_networkrba
| neutron | networkrbacs | uniq_networkrba
+------
16 rows in set (0.003 sec)
some stats are not well updated and we have tried to update them manually with the values of a count(*) from networks, project, or networkrbacs:
update mysql.innodb_ index_stats set stat_value=22865 where table_name= 'networkrbacs' and stat_description in('object_id') and index_name= 'object_ id';
or even
update mysql.innodb_ index_stats set stat_value=2129 where table_name= 'networkrbacs' and stat_description in('action', 'object_id');
and the query is now using index:
MariaDB [neutron]> ANALYZE 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 = '3129fce5e6a249 6c976e8ebc46409 ba8' OR networkrbacs. target_ tenant = '*' OR networks.project_id = '3129fce5e6a249 6c976e8ebc46409 ba8' OR networkrbacs.action = 'access_as_shared' AND (networkrbacs. target_ tenant = '3129fce5e6a249 6c976e8ebc46409 ba8' 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 | 107 | 107.00 | 100.00 | 100.00 | Using index | +------ ------- +------ ------- -+----- --+---- ------- ------- ------- ------- +------ ------- ------- ----+-- ------- +------ ------- ------- -+----- -+----- ---+--- ------- +------ ------+ ------- ------+
+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
+------
| 1 | SIMPLE | networks | index | PRIMARY,
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 1 | 213.69 | 100.00 | 0.36 | Using where |
| 1 | SIMPLE | networkrbacs | ref | object_id | object_id | 110 | neutron.networks.id | 1 | 571.69 | 100.00 | 100.00 | |
+------
3 rows in set (0.071 sec)
Can you explain your issue on your side ? Did you force the index name to use in that name in sqlalchemy or neutron-lib ?
Regards