【发布时间】:2015-10-05 18:49:50
【问题描述】:
我们在 MySql 5.5 中有一个大表(大约有 1.6 亿条记录)。
我们安装 mysql 的机器有 4GB 内存
表架构
+---------------+---------------+------+-----+---------+-------+
| 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 | |
+---------------+---------------+------+-----+---------+-------+
索引
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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 | | |
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
查询示例
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';
我们的查询性能很慢,所以我想在这个表上添加复合索引
我运行了以下命令
ALTER TABLE visit_views ADD INDEX domain_statstime_email (domain,stats_time,email);
运行此命令后,我们的表被锁定,它已达到连接限制(连接限制为 1000)。现在表没有响应任何 INSERTS 和 SELECTS。
这是我的几个问题
1.为什么表被锁定,为什么表没有释放现有连接
2.完成索引需要多少时间。我申请了 3 小时前仍未创建索引。
3.如何查看索引创建进度。
4.为什么在向表中添加索引时连接限制突然增加到最大值。
5.为这种大表添加复合索引是否安全
6.如果我为这个表添加分区,它的性能会更好吗?
我对索引了解不多
一些统计数据
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 3221225472 |
+---------------------------+
【问题讨论】:
-
您示例中的查询只能使用
domain,stats_time,email索引的前两个字段。要使用全部 3 个,您需要将范围条件放在最后的字段 (domain,email,stats_time)。 -
你用的是什么版本? (我正在寻找 ALTER 是否在线完成。)
-
我们使用的是 MySql 5.5
标签: mysql sql database indexing