面试题答案
一键面试实施步骤
- 添加新列:
ALTER TABLE user_info ADD COLUMN new_column VARCHAR(255); -- 根据实际数据类型调整
- 抽取数据:
- 由于数据量庞大,避免一次性更新全部数据,可采用分批更新的方式。
- 例如,通过
LIMIT
和OFFSET
子句来分批处理。
SET @offset = 0; SET @batch_size = 1000; WHILE @offset < (SELECT COUNT(*) FROM user_info) DO UPDATE user_info SET new_column = JSON_UNQUOTE(JSON_EXTRACT(user_profile, '$.specific_key')) -- 根据实际JSON结构调整路径 LIMIT @batch_size OFFSET @offset; SET @offset = @offset + @batch_size; END WHILE;
- 创建索引:
- 为新添加的列创建索引,以提高后续查询性能。
CREATE INDEX idx_new_column ON user_info(new_column);
可能遇到的性能问题
- 更新操作慢:千万级数据量的更新操作,即使分批处理,也可能因为锁表、磁盘I/O等问题导致更新缓慢。
- 查询性能下降:在更新过程中,由于锁机制,可能会影响其他查询操作的性能。同时,更新完成后,如果没有正确创建索引,新列的查询性能也会很差。
优化方案
- 优化更新操作:
- 降低事务隔离级别,例如从
REPEATABLE READ
降低到READ COMMITTED
,减少锁的持有时间,但要注意可能引发的脏读等问题。 - 在更新前,确保MySQL配置参数
innodb_buffer_pool_size
足够大,以减少磁盘I/O。
- 降低事务隔离级别,例如从
- 查询性能优化:
- 在更新操作期间,尽量避免执行大事务的查询。可以将大查询拆分成小查询。
- 对于更新完成后的查询,除了创建索引,还可以考虑使用查询缓存(如果MySQL版本支持且适用场景合适),以及对查询语句进行优化,如使用合适的连接方式、避免全表扫描等。