如果mysql的表上百万千万之后,增加索引时间上会比较久,对于OLTP和OLAP业务都无法满足。直接发起alter也会发生锁表情况。
加索引时间久可能因为如下原因:
1:添加索引的字段表大 索引构建过程中需要操作的数据量较大
2:物理磁盘性能较差 索引结构构建的效率低
3:alter事务可能在等待其他锁释放
4:系统资源被其他服务占用,发生资源抢占。
针对以上情况简单可以考虑如下方式:
1:在线修改表结构 使用pt-online-schema-change,不阻塞读写,耗时久一些可以接受。
2:创建新表,在新表增加索引,增量从原表迁移数据到新表,最终rename表名(适合OLAP场景)
3:提升物理磁盘性能
4:服务器整体负载较低时操作索引添加。
每个原因都可以细分开来分析,这里只简单说下几种情况,可以留言讨论。