最近在网上看到了一个关于“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 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),