大表数据加索引,加字段
2017-11-20 23:54
267 查看
这段时间发现一个800W的用户表 查询非常慢,用了orderby ,排序的字段是string的,虽然也加了索引,但效果不理想。
由于之前的经验,一张5000W的表,orderby 一个timestamp 字段,只要加了 tree 索引,分页10条的速度也是非常快的,于是决定对这张800W表的 timestamp加索引。
但这个表正在运行,有大量的更新,在这个过程停掉服务去处理非常冒险,而且服务是分布式的,并且有多个服务调用,停应用去更新也不现实。
问了一个大牛后,给了一个方案,建一个一样的 tpm表,给 tmp表加索引,然后两个表rename,给主表加索引,再RENAME回来,把TMP表的 新增数据在主表中没有的给INSERT回主表。
废话不多说,SQL如下:
在实际操作中,800W的数据也没啥压力,两个索引,一个用了140S,另一个用了70S,挑在了凌晨处理,很快就搞完了。
但细想,我这个表在切换主要是没有考虑系统的使用,如果在这个过程中,有操作要查询这800W的数据,这个方案还是不完善的。
由于之前的经验,一张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的数据,这个方案还是不完善的。
相关文章推荐
- PHP以指定字段为索引返回数组数据
- postgresql 不同索引所支持的字段数据类型
- PHP以指定字段为索引返回数据库所取的数据数组
- 字段建立索引性能分析数据
- 清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引。
- MSSQL大量数据时,建立索引或添加字段后保存更改----超时------该这么办
- sqlserver2005自动创建数据表和自动添加某个字段索引
- MSSQL大量数据时,建立索引或添加字段后保存更改----超时------该这么办
- 清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引。
- MSSQL大量数据时,建立索引或添加字段后保存更改----超时------该这么办
- 一次 read by other session 的处理过程--数据走索引需要看索引字段的数据分布情况
- 清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引。
- 数据库字段数据类型对索引的影响
- MSSQL SERVER 大量数据时,建立索引或添加字段后保存更改提示超时的解决方法
- PHP以指定字段为索引返回数据库所取的数据数组
- MSSQL 大量数据时,建立索引或添加字段后保存更改提示超时的解决方法
- oracle采用分区表+字段索引测试存储大量数据
- MySQL中大数据表增加字段,增加索引实现
- Cassandra二级索引原理——新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key,并且存储的值为原始数据的Primary Key,然后再通过pk一级索引找到真正的值
- 建在含有null值的字段上的索引会包含null值数据