问题描述
同时有500个人在线,都在同一时间段要操作MYSQL的临时表。这里有个疑问,这个临时表要建议500个还是只建立一个?如果建立1个,同时操作时其它人的数据会不会丢失。这是我的临时表结构,保存在内存中。CREATE TEMPORARY TABLE `tmp_tradelist_$id` ( `tid` bigint(20) unsigned NOT NULL DEFAULT '0', `status` varchar(40) NOT NULL, PRIMARY KEY (`tid`) ) ENGINE=MEMORY DEFAULT CHARSET=utf8";如果使用中间表,每次使用完还要删除数据吗?效率有没有临时表高 问题补充:用来批量更新的。因为要根据不同的条件更新不同的值。每个请求要更新上百条或更多。我想先把要更新的数据插入中间表。然后再从中间表同步更新到原表。我查资料发现有内存的临时表,疑问是使用临时表,同一时间有多个人操作时,临时表里的数据会不会丢失。还是要建立一个普通表。来当成中间表使用。使用完后清空数据呢?
解决方案
引用同时有500个人在线,这个临时表要建议500个还是只建立一个? 如果你是使用CREATE TEMPORARY TABLE...的话,是每个连接=connection会被自动建立1个临时表。如果你没有使用连接池,500个人启动500个连接的话,就会有500个临时表被建立。每个临时表生活在自己的connection/session中,不同连接间看不到对方的临时表。临时表会在连接断开时自动被Drop掉。引用同一时间有多个人操作时,临时表里的数据会不会丢失。不是每个人的单位,是每个连接的单位。即每次打开连接,你都只能重新建立个临时表,使用完扔在那里,断开连接后,系统自动删掉它。引用还是要建立一个普通表。来当成中间表使用。使用完后清空数据呢?我个人推荐这种方式。因为临时表比较是连接单位的,现在全都是connection pool,搞不好数据会串(依赖驱动)。另外每次create,drop(自动)还是有开销的。用中间表的话,一次建好,终身有效,哈。1.调试方便。2.需要自己定时清理。3.最后单独个数据文件加分区,毕竟碎片会很严重。4.设计上要区分每个用户。可以根据业务走,虽然麻烦些,但是灵活。5.互相间看得见。也好也不好。看需求。
解决方案二:
这个临时表是要干什么用?保存用户登录状态么?做登录唯一性校验?如果做唯一性校验有spring security,如果不是,用session保存不可以吗?这么多人频繁操作这张表,即便数据占用内存不大,数据库连接也是一个非常昂贵的资源,要尽量避免此类操作,如果做session同步,可以采用cookie或者memcache。