MySQL/数据库 知识点总结( 五 )


数据库连接本质就是一个 socket 的连接 。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存 。我们可以把数据库连接池是看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接 。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源 。**在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接 。如果使用了所有连接,则会建立一个新连接并将其添加到池中 。**连接池还减少了用户必须等待建立与数据库的连接的时间 。
分库分表之后,id 主键如何处理?因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id 来支持 。
生成全局 id 有下面这几种方式:

  • UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低 。比较适合用于生成唯一的名字的标示比如文件的名字 。
  • 数据库自增 id : 两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用 。这种方式生成的 id 有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈 。
  • 利用 redis 生成 id : 性能比较好,灵活方便,不依赖于数据库 。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本 。
  • Twitter的snowflake算法 :Github 地址: https://github.com/twitter-archive/snowflake 。
  • 美团的 Leaf 分布式ID生成系统 :Leaf 是美团开源的分布式ID生成器,能保证全局唯一性、趋势递增、单调递增、信息安全,里面也提到了几种分布式方案的对比,但也需要依赖关系数据库、Zookeeper等中间件 。感觉还不错 。美团技术团队的一篇文章: https://tech.meituan.com/2017/04/21/mt-leaf.html  。
文章来源:https://www.tuicool.com/articles/VnyQ3yf




推荐阅读