0

I'm migrating and database from mysql to mariadb. the ruby on rails app is doing the following query using cancan so I cannot change the query:

SELECT  DISTINCT COUNT(DISTINCT `buildings`.`id`)
    FROM  `buildings`
    INNER JOIN  `structure_subtypes`
        ON `structure_subtypes`.`id` = `buildings`.`structure_subtype_id`
    WHERE  `buildings`.`id` IN (33553, 33554, 33555, 33556, 33557,
                33558, 33559, 33560, 33561, 33562, 33563, 33564, 33565,
                33566, 33567, 33568, 33569, 33570, 33571, 33572, 33573,
                33574, 33575, 33576,+ ,..., 439515, 439521, 439600, 439602,
                439604, 440016, 440017, 440019, 440275, 440315, 440379,
                440403, 440405, 412987, 439889, 439969, 439980, 440216,
                440218, 440341, 440485, 440486, 440488, 440491, 440494,
                440501, 441458, 441498, 441519, 441536, 443387, 443389,
                443464, 433752, 440109, 440110, 440464, 443938, 440513,
                440514, 443391, 443394, 443353, 443364, 443401, 443486,
                175036, 175037
                          )
      AND  `buildings`.`client_id` IN (175, 47 , 162, 152, 170,
                104, 90, 127, 101, 51, 163, 81, 164, 165, 166, 172, 137,
                174, 106, 108, 161, 158, 169, 97, 123, 136, 102, 157,
                167, 135, 105, 171, 180, 120, 119, 118, 121, 110, 59,
                57, 178, 140, 138, 176, 141, 168, 126, 96, 117, 103, 133,
                173, 131, 179, 80, 100, 95, 116, 142, 147, 159, 160, 154,
                115, 153, 156, 91, 125, 144, 150, 93, 155, 149, 151, 146
                          )
      AND  `structure_subtypes`.`structure_type_id` IN (11, 12,
                13, 14, 15
                          )
      AND  (buildings.created_at >= '2016-12-31 23:00:00')
      AND  (buildings.created_at <= '2017-12-31 22:59:59');

The problem seems to be so many items in the IN section

MySQL "IN" operator performance on (large?) number of values

but the problem is de difference in performance between MYSQL and mariadb

for MYSQL it takes less than 10 seconds

 $ mysql -h 127.0.0.1 -u root -pPASSWORD database

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [database]> RESET QUERY CACHE;
Query OK, 0 rows affected (0.00 sec)

MySQL [database]> Bye

$ mysql -h 127.0.0.1 -u root -pPASSWORD database < select_query.sql

RESULTS

ouput explain:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  buildings   range   PRIMARY,fk__buildings_client_id,index_buildings_on_workflow_state,fk__buildings_structure_subtype_id,index_buildings_on_workflow_state_and_created_at,index_buildings_on_client_id_and_created_at
                index_buildings_on_workflow_state_and_created_at    258 NULL    1001    Using index condition; Using where; Using temporary; Using filesort
1   SIMPLE  structure_subtypes  eq_ref  PRIMARY,index_structure_subtypes_on_structure_type_code,fk__structure_subtypes_structure_type_id    PRIMARY 4   antifraud.buildings.structure_subtype_id    1   Using where; Distinct

output describe table

MySQL [antifraud]> describe buildings;
+--------------------------+---------------+------+-----+---------+----------------+
| Field                    | Type          | Null | Key | Default | Extra          |
+--------------------------+---------------+------+-----+---------+----------------+
| id                       | int(11)       | NO   | PRI | NULL    | auto_increment |
| client_id                | int(11)       | YES  | MUL | NULL    |                |
| observations             | varchar(2000) | YES  |     | NULL    |                |
| created_at               | datetime      | NO   | MUL | NULL    |                |
| updated_at               | datetime      | NO   |     | NULL    |                |
| workflow_state           | varchar(255)  | YES  | MUL | NULL    |                |
| structure_subtype_id        | int(11)       | YES  | MUL | NULL    |                |
| svs                      | tinyint(1)    | YES  |     | NULL    |                |
| parent_id                | int(11)       | YES  | MUL | NULL    |                |
| reference                | varchar(255)  | YES  |     | NULL    |                |
| soc_notify               | tinyint(1)    | YES  |     | NULL    |                |
| origin                   | int(11)       | YES  |     | NULL    |                |
| category                 | int(11)       | YES  |     | NULL    |                |
| ip_filtering             | int(11)       | YES  |     | NULL    |                |
| priority                 | int(11)       | YES  |     | NULL    |                |
| creator_id               | int(11)       | YES  | MUL | NULL    |                |
| external_id              | varchar(255)  | YES  |     | NULL    |                |
| duration_time            | float         | YES  |     | NULL    |                |
| reopening_at             | datetime      | YES  | MUL | NULL    |                |
| closed_at                | datetime      | YES  |     | NULL    |                |
| cbs_detection_id_legacy  | varchar(255)  | YES  |     | NULL    |                |
| cbs_callback_legacy      | varchar(255)  | YES  |     | NULL    |                |
| load_percentage          | float         | YES  |     | NULL    |                |
| items_in_special_domains | tinyint(1)    | NO   |     | 0       |                |
+--------------------------+---------------+------+-----+---------+----------------+
24 rows in set (0.00 sec)

..

MySQL [antifraud]> show index from buildings;
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name                                         | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| buildings |          0 | PRIMARY                                          |            1 | id                | A         |       72567 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | fk__buildings_client_id                          |            1 | client_id         | A         |          82 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state                |            1 | workflow_state    | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_structure_subtype_id                  |            1 | structure_subtype_id | A         |          78 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_parent_id                          |            1 | parent_id         | A         |        4535 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_creator_id                         |            1 | creator_id        | A         |         168 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state_and_created_at |            1 | workflow_state    | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state_and_created_at |            2 | created_at        | A         |       72567 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | index_buildings_on_created_at                    |            1 | created_at        | A         |       72567 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | index_buildings_on_reopening_at                  |            1 | reopening_at      | A         |         806 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_client_id_and_created_at      |            1 | client_id         | A         |          80 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_client_id_and_created_at      |            2 | created_at        | A         |       72567 |     NULL | NULL   |      | BTREE      |         |               |
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
12 rows in set (0.00 sec)

MySQL [antifraud]> Bye

for MariaDB it takes 1 minute 10 seconds

 $ mysql -h 127.0.0.1 -u root -pPASSWORD database



Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.26-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [database]> RESET QUERY CACHE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [database]> Bye

$ mysql -h 127.0.0.1 -u root -pPASSWORD database < select_query.sql

ouput explain:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  buildings   range   PRIMARY,fk__buildings_client_id,index_buildings_on_workflow_state,fk__buildings_structure_subtype_id,index_buildings_on_workflow_state_and_created_at,index_buildings_on_client_id_and_created_at   index_buildings_on_workflow_state_and_created_at    258 NULL    1001    Using index condition; Using where; Using temporary; Using filesort
1   SIMPLE  structure_subtypes  eq_ref  PRIMARY,index_structure_subtypes_on_structure_type_code,fk__structure_subtypes_structure_type_id    PRIMARY 4   antifraud.buildings.structure_subtype_id    1   Using where; Distinct

..

output describe table

MariaDB [antifraud]> describe buildings;
+--------------------------+---------------+------+-----+---------+----------------+
| Field                    | Type          | Null | Key | Default | Extra          |
+--------------------------+---------------+------+-----+---------+----------------+
| id                       | int(11)       | NO   | PRI | NULL    | auto_increment |
| client_id                | int(11)       | YES  | MUL | NULL    |                |
| observations             | varchar(2000) | YES  |     | NULL    |                |
| created_at               | datetime      | NO   | MUL | NULL    |                |
| updated_at               | datetime      | NO   |     | NULL    |                |
| workflow_state           | varchar(255)  | YES  | MUL | NULL    |                |
| structure_subtype_id        | int(11)       | YES  | MUL | NULL    |                |
| svs                      | tinyint(1)    | YES  |     | NULL    |                |
| parent_id                | int(11)       | YES  | MUL | NULL    |                |
| reference                | varchar(255)  | YES  |     | NULL    |                |
| soc_notify               | tinyint(1)    | YES  |     | NULL    |                |
| origin                   | int(11)       | YES  |     | NULL    |                |
| category                 | int(11)       | YES  |     | NULL    |                |
| ip_filtering             | int(11)       | YES  |     | NULL    |                |
| priority                 | int(11)       | YES  |     | NULL    |                |
| creator_id               | int(11)       | YES  | MUL | NULL    |                |
| external_id              | varchar(255)  | YES  |     | NULL    |                |
| duration_time            | float         | YES  |     | NULL    |                |
| reopening_at             | datetime      | YES  | MUL | NULL    |                |
| closed_at                | datetime      | YES  |     | NULL    |                |
| cbs_detection_id_legacy  | varchar(255)  | YES  |     | NULL    |                |
| cbs_callback_legacy      | varchar(255)  | YES  |     | NULL    |                |
| load_percentage          | float         | YES  |     | NULL    |                |
| items_in_special_domains | tinyint(1)    | NO   |     | 0       |                |
+--------------------------+---------------+------+-----+---------+----------------+
24 rows in set (0.00 sec)

MariaDB [antifraud]> show index from buildings;
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name                                         | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| buildings |          0 | PRIMARY                                          |            1 | id                | A         |       71923 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | fk__buildings_client_id                          |            1 | client_id         | A         |          82 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state                |            1 | workflow_state    | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_structure_subtype_id                  |            1 | structure_subtype_id | A         |          80 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_parent_id                          |            1 | parent_id         | A         |        4495 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | fk__buildings_creator_id                         |            1 | creator_id        | A         |         170 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state_and_created_at |            1 | workflow_state    | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_workflow_state_and_created_at |            2 | created_at        | A         |       71923 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | index_buildings_on_created_at                    |            1 | created_at        | A         |       71923 |     NULL | NULL   |      | BTREE      |         |               |
| buildings |          1 | index_buildings_on_reopening_at                  |            1 | reopening_at      | A         |         826 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_client_id_and_created_at      |            1 | client_id         | A         |          80 |     NULL | NULL   | YES  | BTREE      |         |               |
| buildings |          1 | index_buildings_on_client_id_and_created_at      |            2 | created_at        | A         |       71923 |     NULL | NULL   |      | BTREE      |         |               |
+-----------+------------+--------------------------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
12 rows in set (0.00 sec)

I'm playing with the variables in show variables but I do not know how to proceed

Rick James
  • 135,179
  • 13
  • 127
  • 222
anquegi
  • 11,125
  • 4
  • 51
  • 67

1 Answers1

1

Try from buildings use index (primary) inner join ...

ysth
  • 96,171
  • 6
  • 121
  • 214
  • It works pretty fast on maridb now, ¿I should add a primary index in the id/key column? – anquegi Nov 28 '17 at 21:30
  • yes that's true but in mysql there is no need to add this and on mariadb it is needed. i cannit change the query – anquegi Nov 28 '17 at 21:56
  • sorry, I forgot you said that. I don't know why it is using index_buildings_on_workflow_state_and_created_at instead of the primary key or client_id. You could try removing that index (but I don't know what other queries it might be there for) or adding a (id,created_at) or (client_id,created_at) index – ysth Nov 28 '17 at 22:28
  • I tried to add that indexes but it doesn't have effect – anquegi Nov 28 '17 at 22:46
  • 1
    What engine are you using? `SHOW CREATE TABLE` is more descriptive than `DESCRIBE` ! – Rick James Nov 30 '17 at 01:43