java - 关于表的主键问题
问题描述
主键大部分应该只有 整数型(自动递增)或者 系统生成唯一码(例如UUID);想问一下这两种各有什么利弊,希望谈一下实际的经验。
问题解答
回答1:自增id节约存储空间,主键索引不存在插入重排序问题,缺点是数据量有限制,最多存到2^63次方条记录。uuid一般是字符串吧,比整形消耗更多的存储空间,插入时需要索引重排序。原则上数量是没有上限。
回答2:整數型(mysql的索引是以文件形式保存,所以整數型肯定比UUID要小),而且由於是整數型,索引的效率也肯定比UUID要高,但由於是自動遞增,所以mysql在每次插入數據時候,就要對表進行鎖表,導致在大量並發之下,對mysql服務器開銷特別大。而UUID就在處理並發方面比整數自增的好
回答3:uuid 支持分库
回答4:字段为主键时,整数型比字符串型节省空间(你应该记得int只需4个字节吧,char一个字符一个字节)字段不为主键时,除了节省空间,整数型比字符串型快很多,根据字符长度呈几何倍数增长
对于追求完美的,像ip地址这种数据,也是用整数保存在数据库中的(IP地址字符串与整数有一套固定的算法)。
举个例子;假如一个字段的值为1234567890,没有主键的情况下做sql查询时 where id >= ’1234567890’int型只需比较1次char型需要比较10次,每个字符都要参与比较。所以字符越长,速度越慢
如果数据库的数据量足够大,你执行类似sql也能很容易检验处char型的速度where id like ’123%’ limit 5;where id like ’1234%’ limit 5;where id like ’12345%’ limit 5;where id like ’123456%’ limit 5;以上sql,执行速度依次更慢。因为字符越长,参与比较的次数越多。
而int型无论长短,只比1次
相关文章:
1. mysql - 一个sql的问题2. thinkphp3.2.3对接新版支付宝3. 网络爬虫 - python sys 模块 设置编码老是报错4. 取不出SQL得到的当前页5. python3.x - python多线程如何修改数据?6. android - 安卓微信刷卡支付的DEMO7. 网页爬虫 - python爬虫用BeautifulSoup爬取<s>元素并写入字典,但某些div下没有这一元素,导致自动写入下一条,如何解决?8. python - 用ffmpeg采集视频,用terminate没法结束进程9. css3 - 新版支付宝 账单页面滑动时月份栏被下一个月给顶上去是什么效果10. Python, for-else, while-else是否造成了语义歧义 ( 增加心智负担 )?

网公网安备