问题参考自:https://www.zhihu.com/question/438078173,以下解答思路为个人原创

首先提出假设:

  1. 手机号码不会更新,只会插入和删除。
  2. 查询包括精确查询某个手机号是否存在,以及获取某一号码段的所有手机号

假设表只有一个字段,就是手机号 phone,并且设置为主键。如果不设置主键并且没有唯一索引,InnoDB 会给我们自动生成一个隐藏主键列,浪费空间。

MyISAM or InnoDB

如果插入和删除并不频繁,手机号是提前载入的字典表,而不是用户主动注册而产生的,则 MyISAM 看上去比 InnoDB 要好。因为 MyISAM 不涉及事务,更新都是表级锁。如果是用户触发的插入和删除,则需要用 InnoDB。

字段类型

考虑三种类型,BigInt,Char,Varchar

这几种类型在 InnoDB 引擎下默认行格式的存储方式为:

  • 对于 bigint 类型,如果不为 NULL,则占用8字节,首位为符号位,剩余位存储数字,数字范围是 -2^63 ~ 2^63 - 1 = -9223372036854775808 ~ 9223372036854775807。如果为 NULL,则不占用任何存储空间
  • 对于定长字段,不需要存长度信息直接存储数据即可,如果不足设定的长度则补充。对于 char 类型,补充 0x20, 对应的就是空格。
  • 数据开头有可变长度字段长度列表,所以 varchar 只需要保存实际的数据即可,不需要填充额外的数据。正是由于这个特性,对于可变长度字段的更新,一般都是将老记录标记为删除,在记录末尾添加新的一条记录填充更新后的记录。这样提高了更新速度,但是增加了存储碎片。

由于手机号不更新,并且不同国家的手机号长度不同,并且可能有特殊字符,字符类型在默认的编码和排序规则下进行范围匹配也能满足我们的需求,所以为了节省空间,使用 varchar 类型。

索引类型

由于涉及到范围查询,所以最好不用 Hash 索引,而是用默认的 B+ 树索引

分区

这个数据量比较大了,需要用分区。phone 可以作为分区键,可以按照范围分区,例如:

PARTITION BY RANGE COLUMNS( phone ) (PARTITION p0 VALUES LESS THAN ('13100000000'),PARTITION p1 VALUES LESS THAN ('13200000000'),。。。。PARTITION pn VALUES LESS THAN MAXVALUE);

也可以按照 hash 分区,例如:

PARTITION BY HASH( phone )
PARTITIONS 64;

这样查询某个手机号是否存在这种业务就能更快,因为一张表被划分成了很多张小表。并且如果涉及多张小表 MySQL 还可以多线程并发查,效率提升很多。如果考虑获取某一号码段的所有手机号,那最好还是按照范围分区,可以使逻辑查询范围更小。但是 hash 分区数据可能比范围分区更加均衡。

注意,对于 HASH 分区个数最好是 2^n。因为对于 2^n 取余相当于对 2^n - 1 取与运算,增加了查询时的计算分区的效率

进一步优化

对于查询某个手机号是否存在,可以在数据库上层加一层布隆过滤器,提高效率。

同时为了提高准确性,可以通过号码号段,不同号段使用不同的布隆过滤器。在插入数据库的同时,放入布隆过滤器中。如果布隆过滤器中检测不存在,则肯定不存在。为了减少布隆过滤器的误判概率,可以使用更多的布隆过滤器,同时设置交叉范围,例如一个 13000000000~13200000000 用布隆过滤器 A,13100000000~13300000000 用布隆过滤器 B, 13211111111就要经过布隆过滤器 A 和 布隆过滤器 B 的验证。

每日一刷,轻松提升技术,斩获各种offer:

每日一面 - mysql中,我存十亿个手机号码,考虑存储空间和查询效率,怎么设计?相关推荐

  1. mysql 手机号 字段_2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?...

    福哥答案2021-01-06: [答案来自此链接:](https://www.zhihu.com/question/438078173) 首先提出假设: 考虑一下这几个问题: 手机号码都是数字吗? 都 ...

  2. 手机号码 mysql 存储类型_2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?...

    福哥答案2021-01-06: 答案来自此链接: 首先提出假设: 考虑一下这几个问题: 手机号码都是数字吗? 都是中国的手机号码吗? 会按照手机号等值查询吗? 会按照手机号范围查询吗? 需要手机号列唯 ...

  3. mysql 存电话号码应该用哪个字段_2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?...

    福哥答案2021-01-06: 答案来自此链接: 首先提出假设: 考虑一下这几个问题: 手机号码都是数字吗? 都是中国的手机号码吗? 会按照手机号等值查询吗? 会按照手机号范围查询吗? 需要手机号列唯 ...

  4. 周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,表中没有的课程列值为空的解决方法

    周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号.课程名称.选修人数,表中没有的课程列值为空的解决方法 实验前期准备 course表(课程表) 在其中: c ...

  5. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  6. MySQL / B + 树算法在 mysql 中能存多少行数据?

    在面试的时候,如果问到了 B + 树这个东西,或者问到了 MySQL 索引的底层实现,也希望大家能够进一步的发挥,和面试官探讨一下,为什么 B+ 树一般都是 3 层左右,为什么 3 层的 B + 树可 ...

  7. mysql检查存在_如何检查MySQL中是否存在行?(即检查MySQL中是否存在电子邮件)...

    小编典典 以下是经过尝试,测试和证明的检查行是否存在的方法. (其中一些我自己使用,或者过去使用过). 编辑: 我在使用mysqli_query()两次的语法中犯了一个先前的错误.请查阅修订版本. 即 ...

  8. B+树算法在mysql中能存多少行数据?

    在面试的时候,如果问到了B+树这个东西,或者问到了MySQL索引的底层实现,也希望大家能够进一步的发挥,和面试官探讨一下,为什么B+树一般都是3层左右,为什么3层的B+树可以存放2千万的数据,这个到底 ...

  9. clickhouse 增量更新_干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用...

    本文转自| 携程技术中心  作者 | 蔡岳毅 作者简介蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作.喜欢探索研究大数据的开源技术框架.一.背景 1)携程酒店每天有上 ...

最新文章

  1. IBM服务器raid5崩溃数据恢复方案及过程
  2. 2019 微软Build大会预告:值得开发者期待的是哪些?
  3. CDN如何实现,关键技术是什么?
  4. 高通8155车载芯片_WEY来“摩卡”云首秀,搭载高通8155芯片
  5. 对象序列化时候无法创建类似如此(king:astar)的元素名
  6. 手机代理上网_ip地址是怎么来的?手机电脑怎么获得IP地址?
  7. WIFI无线协议802.11a/b/g/n/ac的演变以及区别
  8. 计算机电子表格today函数,EXCEL函数教育之今天(today)与现在(now)
  9. 表情识别论文《OAENet Oriented Attention Ensemble for Accurate FacialExpression Recognition》中文翻译
  10. 在本地电脑运行vue-element-admin
  11. JavaScript运算规则
  12. LaTex(PART III)命令环境和简单的数学公式、插图、表格
  13. 互斥锁(mutex)的使用
  14. 统计员工信息c语言设计,工资信息管理系统C语言设计
  15. 如何查看windows版本
  16. 顺序结构,选择结构和循环结构
  17. 测试使用linux日志定位BUG,Web测试中定位bug方法
  18. php贴吧源码,FluxBB v1.5.11 php论坛贴吧源码下载
  19. 浅谈如何搭建家庭游戏服务器
  20. MAC查找文件的绝对路径

热门文章

  1. ObiCloth布料缝合
  2. 企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  3. 为什么世界上没有安全的工作?
  4. 支付宝内测商家版「朋友圈」
  5. 教你轻松理解Go Ticker的用法和实现原理
  6. win11使用移动硬盘(固态非固态)卡顿问题解决
  7. InnoSetup 使用
  8. RS485,uart串口加瑞芬68协议
  9. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)
  10. 成都榆熙:拼多多商家都想要提高客单价,但是怎么去提高呢?