您的位置:首页 > 其它

大表数据加索引,加字段

2017-11-20 23:54 267 查看
这段时间发现一个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的数据,这个方案还是不完善的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  索引 数据
相关文章推荐