当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=99){ echo "$newNumber \r\n"; $sql="CREATE TABLE `code_".$i."` ( `full_code` char(10) NOT NULL, `create_time` int(10) unsigned NOT N…
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=99){ echo "$newNumber \r\n"; $sql="CREATE TABLE `code_".$i."` ( `full_code` char(10) NOT NULL, `create_time` int(10) unsigned NOT N…
2018-08-18 16:58 无腿鸟 阅读(331) 评论(0) 编辑 收藏 问题:当一个表的数据量超过一亿条,要删除其中的5000w条,如何处理. 如果直接使用delete语句,会涉及到到大量的磁盘IO,并产生大量的数据库日志,效率很低,删除速度慢,可能导致事务中断,甚至有服务器硬盘空间撑爆的可能. 本文提供的思路是先将数据表需要保留的数据不带索引导出,然后导入一个新表中 ,对新表重建索引后将老表.新表进行重命名,这样就完成了删除操作,效率有了很大提升. 主要分为三步,1.数据导出2. 数…
分段更新 UPDATE question SET `status`=1 WHERE status!=1 LIMIT 3000;UPDATE answer SET `status`=1 WHERE status!=1 LIMIT 3000; 分段更新,分批生效 总体根据上图,和全量更新对比,单位时间InnoDB Row Operation udp数降低,原来3000*2 优化 借助id UPDATE answer SET `status`=1 WHERE id>40072000 LIMIT 800…
读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXISTS createManyTable; create PROCEDURE createManyTable() BEGIN DECLARE i int; ); ; DO SET fileName=CONCAT('f_log_',i,'.txt'); SET @STMT :=CONCAT("selec…
总结/朱季谦 B+树是一种在非叶子节点存放排序好的索引而在叶子节点存放数据的数据结构,值得注意的是,在叶子节点中,存储的并非只是一行表数据,而是以页为单位存储,一个页可以包含多行表记录.非叶子节点存放的是索引键值和页指针. 那么,在MySql数据库里,一个页的大小是多少呢? 可以通过查询语句进行查看:show variables like 'innodb_page_size' 查询结果16384字节,可以通过1kb等于1024字节方式,计算出16384/1024 = 16kb,说明MySql数据…
序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜问题: 第一章 消消乐排行榜大致分为好友排行榜和全国排行榜: 好友排行榜和全国排行榜的其实是重合的只是需要从全国排行榜中提取出来而已: 那么就需要记录所有玩家的通关记录已进行查询: 也许你说全国排行榜只显示前xxx名就好:但是你的好友记录必须要的吧?你的好友不可能全部进入全国排行榜吧: 而好友排行榜…
mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对需要操作的表放入子查询条件中的,因此我们尽量避免子查询中涉及到需要操作的表,如果无法避免,则可以考虑用连接查询的方式进行. ERROR 1093 (HY000): You can't specify target table 'dir' for update in FROM clause 1.2 根…
test=# insert into tbl_time1 select generate_series(1,100000000),clock_timestamp(),now(); INSERT 0 100000000 Time: 525833.218 ms 约:8.7分钟   COUNT,没有索引,1亿条数据. test=# select count(1) from tbl_time1;    count   -----------  100000000 (1 row) Time: 307065…
需求:有一张表9亿多条数据,数据加索引总数据量61GB.考虑到这张表的大部分数据都不会再被使用并且大数据量可能影响整库的性能,所以决定将表里某一个时刻之前的数据备份到一张新表中,待备份完成后将旧表中已经备份的数据删除.由于数据量太大,不适合让DBA直接做备份. 方案1 main线程分页读取旧表数据,每页200条.每读取一页数据就新建一个线程,将200条数据交给新建的线程去完成insert到新表的操作. 弊端:需要将数据读到内存,然后再写回数据库,涉及到大量的IO操作.所有的数据都需要走网络,对网…