最近在网上看到了一个关于“mysql分表后如何插入新数据”的问题,对一个用户表进行分表,他的分表规则是按用户ID来分的,但是当有一条新数据要插入时,还没有用户ID,因此不知道插入哪一张分表中(因为只有当数据插入后才会有用户ID)。
我的想法是这样的:专门建一张表,用来存放所有用户ID,也就是说当有新数据插入时,先在这张表中产生一条记录,这条记录的主键就作为新用户ID,然后再根据这个用户ID来决定这个用户的注册数据插入到哪一张分表中。
这类问题,不知道大家是怎么处理的,想听听在家的做法……
回复内容:
最近在网上看到了一个关于“mysql分表后如何插入新数据”的问题,对一个用户表进行分表,他的分表规则是按用户ID来分的,但是当有一条新数据要插入时,还没有用户ID,因此不知道插入哪一张分表中(因为只有当数据插入后才会有用户ID)。
我的想法是这样的:专门建一张表,用来存放所有用户ID,也就是说当有新数据插入时,先在这张表中产生一条记录,这条记录的主键就作为新用户ID,然后再根据这个用户ID来决定这个用户的注册数据插入到哪一张分表中。
这类问题,不知道大家是怎么处理的,想听听在家的做法……
抱歉我忽视了用户名如今已经不是单一的登陆查询和用户识别的依据了。
现在这个时代,登录的依据如此庞杂(手机、邮箱、用户名、各种第三方认证),并且一个人往往有多个登录入口,总不可能把每个人的数据重复存储多次……
我们首先认可这个原则没有改变:查询什么,就必须根据什么来分表。那么在这个原则之下,就只好采取二级分表的方法了。
先建立一个前级表格,记录所有的登录依据,所对应的用户ID。例如这样:
<code> Criteria UserID --------------------------- testuser1 1 testuser2 2 1@example.com 1 15200000001 1 **weibo_auth_data 2 </code>
对这个表进行分表的方法,仍然使用对关键词做hash的方式就不错。归根到底,无论用户名、邮箱、手机等各种登陆方法,本质无非是凭一个字符串查询用户ID,体现多对一的关系。
而真正存储用户信息的地方,就按用户的唯一标识分表就行了。
注意我没有用“用户ID”这个说法。因为在分表的情况下,还使用合表时适用的单一数字递增ID,恐怕就不是什么好主意了。有一个简单的结论:分表,自然是性能实在合不上了才要分。所以分布式的结构中,无法再包含集中式的结构。提问中所说的“单独组织一个用户ID总表”的办法,显然是行不通的。
我倾向于把用户的这个唯一标识做成一个二元组。
大的方面,用户注册时用Hash等任何算法,对用户的注册数据做个简单平摊,决定用户所在的桶编号iBucket
。
小的方面,在每个单独的分表中按单一递增ID,决定用户在表内的局部编号iID
。
查询用户的时候,一律用两个编号(iBucket, iID)
决定一个用户。这样就既遵守了增加数据后才得到用户ID,又达到了分表的目的。
注意两点:
- 使用了Hash,别忘了一定要约束用户输入的最大长度,严防Hash冲撞攻击。
- 如果用户表真的大到了非分表不可的程度,实践中可能需要考虑采用NoSQL的数据库引擎,例如Redis。
哥们你真不嫌费劲吗?
分表的最大目的是为了高效查询,所以分表的依据,就必然和查询的关键字有直接的联系。从这个意义上看,除非你的用户用ID而不是用户名来登录,否则“按用户ID分表”本身就是一个馊的要死的主意。
我推荐的分表依据是对用户名做HASH,取HASH结果16进制串的头1位(或几位)。这样可以非常简单的把集合无限大的用户名,简单的分割成几个桶,同时各个桶之间无需维护就能达到非常好的均衡。
楼上的写的太复杂了吧。。。其实简单直白有效的做法就跟楼主写的差不多,单独用一张步长表,如果你分两个表的话,步长表的步长为2,表1从0开始每次加步长2,表2从1开始每次加步长2,这样就会取到表1和2各自的id又不会冲突,然后把这个生成的id记录到步长表中,然后每次算id的时候取出步长表的id加上步长,然后再把新的id写入到步长表中,拿到这个id后你就可以插入数据分表中了。

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用