大表数据加索引,加字段

这段时间发现一个800W的用户表 查询非常慢,用了orderby ,排序的字段是string的,虽然也加了索引,但效果不理想。

由于之前的经验,一张5000W的表,orderby 一个timestamp 字段,只要加了 tree 索引,分页10条的速度也是非常快的,于是决定对这张800W表的 timestamp加索引。

但这个表正在运行,有大量的更新,在这个过程停掉服务去处理非常冒险,而且服务是分布式的,并且有多个服务调用,停应用去更新也不现实。

问了一个大牛后,给了一个方案,建一个一样的 tpm表,给 tmp表加索引,然后两个表rename,给主表加索引,再RENAME回来,把TMP表的 新增数据在主表中没有的给INSERT回主表。

废话不多说,SQL如下:


-- 创建tmp表
create table tx_xxxxx_user_tmp_data like tx_xxxxx_user;
-- 
ALTER  TABLE  tx_xxxxx_user_tmp_data  ADD  INDEX idx_device_guid (device_guid);
 ALTER TABLE tx_xxxxx_user_tmp_data ADD INDEX idx_update_time (update_time) ;
-- 
-- insert into tx_xxxxx_user_tmp  select * from tx_xxxxx_user ;
-- select count(id) from tx_xxxxx_user_tmp ;
 -- -- 换表
  RENAME TABLE tx_xxxxx_user TO tx_xxxxx_user2, tx_xxxxx_user_tmp_data to tx_xxxxx_user;
-- -- 
-- -- -- 增加大表索引
  ALTER  TABLE  tx_xxxxx_user2  ADD  INDEX idx_device_guid (device_guid);
  ALTER TABLE tx_xxxxx_user2 ADD INDEX idx_update_time (update_time) ;
-- -- 
-- -- 
-- -- -- 换回来
 RENAME TABLE tx_xxxxx_user TO tx_xxxxx_user_tmp_data, tx_xxxxx_user2 to tx_xxxxx_user;
-- 查看总数
SELECT count(1) from tx_xxxxx_user t ;
SELECT count(1) from tx_xxxxx_user2 t ;
SELECT * from tx_xxxxx_user_tmp_data t  limit 10;
SELECT * from tx_xxxxx_user t  limit 10;

-- 查看新增的用户数据
-- EXPLAIN
SELECT * from tx_xxxxx_user_tmp_data  o where o.id not in (
SELECT t.id from tx_xxxxx_user_tmp_data t,tx_xxxxx_user t2 where 1=1
and t.login_name = t2.login_name
and t.source = t2.source
);


在实际操作中,800W的数据也没啥压力,两个索引,一个用了140S,另一个用了70S,挑在了凌晨处理,很快就搞完了。

但细想,我这个表在切换主要是没有考虑系统的使用,如果在这个过程中,有操作要查询这800W的数据,这个方案还是不完善的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值