Composite index on a large table optimizing aggregate query

In MySql 5.5, we have a large table (with about 160 million records).

A machine with 4 GB of RAM, where we installed our mysql

table layout

+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| domain        | varchar(50)   | YES  | MUL | NULL    |       |
| uid           | varchar(100)  | YES  |     | NULL    |       |
| sid           | varchar(100)  | YES  | MUL | NULL    |       |
| vurl          | varchar(2500) | YES  |     | NULL    |       |
| ip            | varchar(20)   | YES  |     | NULL    |       |
| ref           | varchar(2500) | YES  |     | NULL    |       |
| stats_time    | datetime      | YES  | MUL | NULL    |       |
| country       | varchar(50)   | YES  |     | NULL    |       |
| region        | varchar(50)   | YES  |     | NULL    |       |
| place         | varchar(50)   | YES  |     | NULL    |       |
| email         | varchar(100)  | YES  | MUL | NULL    |       |
+---------------+---------------+------+-----+---------+-------+

Indices

    +------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name         | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| visit_views |          1 | sid_index        |            1 | sid         | A         |   157531031 |     NULL | NULL   | YES  | BTREE      |         |               |
| visit_views |          1 | domain_index     |            1 | domain      | A         |          17 |     NULL | NULL   | YES  | BTREE      |         |               |
| visit_views |          1 | email_index      |            1 | email       | A         |      392845 |     NULL | NULL   | YES  | BTREE      |         |               |
| visit_views |          1 | stats_time_index |            1 | stats_time  | A         |    78765515 |     NULL | NULL   | YES  | BTREE      |         |               |
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Request example

SELECT count(*)
  FROM visit_views
 WHERE domain ='our'
   AND email!=''
   AND stats_time BETWEEN '2010-06-21 00:00:00' AND '2015-08-21 00:00:00';

We have very low performance for queries like the above, so I want to add a composite index to this table

I executed the following command

ALTER TABLE visit_views ADD INDEX domain_statstime_email (domain,stats_time,email);

after running this command, our table is locked, it has reached the connection limit (connection limit is 1000). Now the table is not responsible for any INSERTS AND ELECTIONS.

Here are my few questions.

1. Which table is locked and why the table does not release existing connections

2. How long does it take to complete the index. I applied 3 hours ago until an index was created.

3. .

4. max .

5.

6. , .

+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
|                3221225472 |
+---------------------------+
+4
1

: , .

WHERE domain ='our'
  AND email!=''
  AND stats_time BETWEEN '2010-06-21 00:00:00' AND '2015-08-21 00:00:00';

, , , .

 (email, domain, stats_time)
 (domain, email, stats_time)

? MySQL - BTREE. , . , , MySQL , . , stats_time. , . . , stats_time.

? , MySQL , . .

, ,,

 (domain, stats_time, email)

/stats _time, . , ( ) . .

email NOT NULL, . http://use-the-index-luke.com/ .

:

max .

, . , 160 , . , . , -, , .

. 3 , .

. , , . , , , .

.

SHOW FULL PROCESSLIST MySQL. .

, , .

, .

, . WILL DELETEING , .

0

Source: https://habr.com/ru/post/1598199/


All Articles