通过在您的MySQL表上设置适当的索引,您可以大大提高挑选查询速度。但是,您知道向表中添加索引本身是一项复杂的操作,并且可能需要很长时间才能完成,这取决于表的大小吗?在此期间,您还可能会遇到查询性能下降的情况,因为您的系统资源也忙于索引创建工作。在这篇博客文章中,我们讨论了一种优化MySQL索引创建过程的方法,使您的常规工作负载不受影响。
MySQL滚动索引创建
我们称这种方法为“滚动索引创建”——如果您有一个MySQL主从副本集,您可以以滚动方式一次创建一个节点的索引。您应该只在从属节点上创建索引,这样不会影响主节点的性能。当从服务器上的索引创建完成后,我们将当前主服务器降级,并将其中一个最新的从服务器提升为新的主服务器。此时,索引构建继续在原始主节点(现在是从节点)上进行。由于故障转移,您将在短时间内(几十秒)失去与数据库的连接,但这可以通过应用程序级重试来克服。
滚动索引创建的性能优势
我们做了一个小实验来了解滚动索引创建的性能优势。
测试使用了一个使用Sysbench它有三张各有5000万行的表。我们在MySQL主服务器上生成了负载,30个客户端运行了10分钟的平衡工作负载(50%的读取和50%的写入),同时在两种情况下,在其中一个表上构建了一个简单的辅助索引:
1.直接在母版上创建索引
2.在从属服务器上创建索引
MySQL测试床配置
MySQL实例类型
EC2实例m4 大型8GB内存
部署类型
具有半同步复制的2节点主从集
MySQL版本
5.7.25
绩效结果
方案
工作负载吞吐量(每秒查询数)
第95百分位延迟
在母版上创建索引
453.63
670毫秒
滚动索引创建
790.03
390毫秒
外卖食品
通过直接在MySQL主机上运行索引创建,我们只能体验到通过滚动操作在MySQL从机上运行索引创建所获得的吞吐量的60%。当在主服务器上创建索引时,查询的第95百分位延迟也高1.8倍。
自动创建滚动索引
ScaleGrid为您的自动创建滚动索引MySQL部署用一个简单的用户界面来启动它。
在上面的用户界面中,您可以选择您的数据库和表名,并“添加索引”作为“更改表”操作。然后,指定列名和索引名,将为您生成并显示一个更改表命令。单击“创建”后,索引创建将以滚动方式一次创建一个节点。
此外,ScaleGrid还支持其他简单的更改表操作,如以滚动方式向表中添加新列。