常见的两种方案,遍布网络:

第一种:

replace方案,mysql解释:REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

CREATE TABLE `user_id_seq` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`stub` varchar(3) NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `stub` (`stub`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

REPLACE INTO user_id_seq(stub) VALUES ('a');

select last_insert_id();

这种方案一般一个表对应一个类型的主键,简单明了,一个表对应一个业务的seq。但是在高并发的情况下很容易导致mysql死锁。

第二种:

CREATE TABLE `sequence` (

`name` varchar(50) NOT NULL,

`id` bigint(20) unsigned NOT NULL DEFAULT '0',

PRIMARY KEY (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO `sequence` (`name`) VALUES('users');

update sequence set id=last_insert_id(id+1) where name = 'users';

select last_insert_id();

这种方案可以一个表支持多个业务的seq需求,但是太多的业务对这一个表频繁操作,如果某个业务出现锁表,就会导致其他业务无法进行。

第三种:

如果是java的项目,可以使用spring框架的MySQLMaxValueIncrementer解决,在mysql上实现原理同第二种,只是在业务层加了一段本地缓存,对于seq请求很高的业务可以较好的保障。

以上三种方案的都关系到mysql的last_insert_id()这个功能,其实关键点也就是这个last_insert_id()使我们可以通过mysql实现唯一seq的设计。

mysql中对它的解释:【对于LAST_INSERT_ID(),最近生成的ID是在服务器上按连接维护的。它不会被另一个客户端改变。即使用non-magic值(即非Null非0值)更新了另一个AUTO_INCREMENT列,也不会更改它。】

mysql如何获得上次插入行的唯一ID

http://dev.mysql.com/doc/refman/5.1/zh/apis.html#getting-unique-id 这样不管我们如何设计,只要保证select last_insert_id();之前的操作是一个连接完成的原子操作,我们就能从返回值中得到唯一的last_insert_id。

mysql分库主键_分库主键设计-Mysql相关推荐

  1. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  2. mysql实现关注收藏_收藏|我的Mysql学习笔记

    欢迎关注我的公众号:早起Python 大家好,今天是陈熹专栏 SQL是一个存活近半个世纪的语言,如今仍有大量人在使用.它语法简单,对培养数据整理和提取的思维有很大帮助.我将我过去的笔记分享给大家,希望 ...

  3. mysql date 默认值_通过Oracle DB了解MySQL

    Oracle数据库是业界的翘楚,各行各业拥有大量的Oracle DB的DBA,本文尝试通过将Oracle与MySQL数据库的架构.安全.模式对象.数据类型及数据存储进行对比,以方便熟悉Oracle数据 ...

  4. mysql innodb 缓存设置_数据库分享一: MySQL的Innodb缓存相关优化

    无论是对于哪一种数据库来说,缓存技术都是提高数据库性能的关键技术,物理磁盘的访问速度永 远都会与内存的访问速度永远都不是一个数量级的.通过缓存技术无论是在读还是写方面都可以大大提 高数据库整体性能. ...

  5. mysql主流使用版本_简述3个主流MySQL版本特性

    MySQL作为一个关系型数据库管理系统,在数据处理方面有其独特的优势.MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,使得MySQL占 ...

  6. ubuntu安装mysql 密码忘了怎么办_在ubuntu上面安装mysql都密码忘记及一些常用命令...

    重改密码! # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & ...

  7. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  8. mysql实现心跳表_第29问:MySQL 的复制心跳说它不想跳了

    问题 最近年底,大家的数据库经常跑批量大事务,会发现复制突然断开,报错"心跳与本地信息不兼容": 会是什么原因? 实验 我们先来复现一下,再进行分析. 宽油,做一对主从数据库: 我 ...

  9. mysql 字符大对象_第02期:MySQL 数据类型的艺术 - 大对象字段

    我以前分享过一篇<MySQL 大对象一例>,今天就来详细说下大对象的优缺点以及使用场景. 我们把 MySQL 的大对象类型分 TEXT/BLOB 和 JSON 两部分来说明. 一.TEXT ...

  10. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析

    隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...

最新文章

  1. 互联网人的平均时长,居然这么短...
  2. k8s 自定义dns_K8S 生态周报| Docker v19.03.10 正式发布
  3. SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库
  4. 一起学设计模式 - 命令模式
  5. CallContext和多线程
  6. linux的write是线程安全的吗,socket的write/send还是是否是线程安全?
  7. ASP.NET Core开发常见“坑”
  8. 【演讲实录】下一代企业级应用架构管理体系
  9. 实战篇|风控策略效率的测试、调优与评估
  10. 对数组名取地址a和 数组首地址a
  11. C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从【网路图片】、【Assets资源】、【UI】修改锁定画面。...
  12. 基于arduino WS2812b RGB灯带控制程序一
  13. 陀螺仪数据转换成角度_MPU6050 计算角度
  14. 企业如何避交所得税__公司如何才能少交企业所得税
  15. 【AIOT】HumanCenteredSensing
  16. Python温度转换程序
  17. UVA1449 Dominating Patterns
  18. 成考计算机专业难不难,成人高考计算机专业难吗?
  19. 移动端架构师学习路线
  20. 超简单的位运算---再也不用担心看不懂题解了

热门文章

  1. Spring Security 实战干货:OAuth2第三方授权初体验
  2. Facebook 开源 Instagram 安全工具 Pysa
  3. 有比 ReadWriteLock更快的锁?
  4. 接地气的数据分析入门与进阶
  5. 每秒上万并发下的Spring Cloud参数优化实战
  6. pytorch 计算相似度,相关系数
  7. DetNAS ThunderNet
  8. linux Pytorch C++ 环境搭建
  9. Layout of the output array img is incompatible with cv::Mat (step[ndims-1] !
  10. map/set iterator not dereferencable