《MySQL DBA修炼之道》——3.6 ID主键

3.6 ID主键

下面先说明选择主键的注意事项。
1) 建议主键是整型。
2) 如果表中包含一列能够确保唯一、非空(NOT NULL),以及能够用来定位一条记录的字段,就不要因为传统而觉得一定要加上一个自增ID做主键。
3) 主键也遵从索引的一些约定,注意联合主键的字段顺序。
4) 为主键选择更有意义的名称,如ID这个名称太过笼统,表达的信息可能不准确。
1.自增ID主键
自增列是MySQL里的一种特殊的整型,我们定义一个列的整型的同时,可以设置它是否为自增的,一个表只能有一个列是自增列,且自增列必然是主键列。自增列的默认起始值是1,默认可以按步长为1进行递增,自增列的增长将受两个MySQL全局参数的影响。
auto_increment_offset:确定AUTO_INCREMENT列值的起点。
auto_increment_increment:控制列值增加的间隔,即步长。
也可以单独定义某个表的起始值,如:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
在复制环境中,设置这两个值可以减少主键冲突,关于这一点以后会在复制章节(第12章)中详述。
使用自增列的原因是唯一标识数据表的某行记录。它们也被用来优化表之间的连接。连接单个列比连接多个列更快,连接整数列比连接其他大多数数据类型也更快。总之,有很多使用它的理由。但也没有必要滥用自增ID,给每个表都设置一个自增ID做主键,有时可能存在另一个从逻辑上来说更加自然的主键。
另外,因为InnoDB引擎的ID主键是聚集索引,从前文可以得知,如果簇索引、数据和主键索引放在一起且是按主键索引进行排序的,那么基于自增主键的单个值查找和小范围查找将是最高效的。
研发人员有时倾向于使用字符串做主键,或者使用多个列的联合主键,但需要清楚一个事实:InnoDB的其他索引实际上存储了主键的值,这样做可能会导致索引空间大大增加。
InnoDB选择主键创建簇索引。如果没有主键,就会选取一个唯一非空的索引来替代;如果仍然找不到合适的列,那么将创建一个隐含的主键来创建簇索引。选取一个唯一非空的索引做主键可能不是我们所期待的,一般的解决办法是删除我们不期望的主键(唯一索引),创建一个非空的自增列,再增加这个唯一索引。
例如,由于未定义主键,InnoDB自动把唯一索引idx_a_b(a,b)定义为主键了。我们想增加一个自增ID主键,并设置唯一索引idx_a_b。idx_a_b表示这个索引是建立在a列和b列的复合索引。

ALTER TABLE table_name
ADD COLUMN 'id' bigint UNSIGNED NOT NULL AUTO_INCREMENT first,
DROP PRIMARY KEY,
ADD PRIMARY KEY('id') ,
ADD INDEX idx_a_b on table_name(a,b);

2.自增ID可以插入指定的值
自增ID还有一个特性,那就是如果插入0值或NULL值,InnoDB会认为没有设定值,然后帮你自增一个值。所以可以利用这个特性生成全局唯一ID、序列。如果数据分片到许多实例、机器上,那么就需要一个全局唯一ID来标识记录了。如下是官方文档推荐的一个创建唯一序列的方法。
创建一个表,用来控制顺序计数器并使其初始化。
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);
使用该表产生如下的序列数。
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();
高并发下,LAST_INSERT_ID函数可能会有一定的性能问题,但这种方法很简单,一般情况下是可以满足需要的。

时间: 2024-08-04 05:48:41

《MySQL DBA修炼之道》——3.6 ID主键的相关文章

《MySQL DBA修炼之道》——导读

前言 为什么要写本书 本书主要讲述MySQL DBA的必备技能,包括MySQL的安装部署.开发.测试.监控和运维,此外,读者还可从中学习到系统架构的一些知识. 我从业10多年,先是在传统行业做开发工程师.系统管理员.Oracle DBA,2008年因为机缘巧合投身互联网,开始从事MySQL运维工作.相对于成熟的商业数据库,MySQL缺乏高质量的技术文档和图书,我在接触MySQL的过程中,也感觉市面上的相关图书还存在一些不足,难以系统化地学习MySQL. 从一名Oracle DBA转型为一名MyS

《MySQL DBA修炼之道》——第3章 开发基础 3.1相关基础概念

第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. 第3章开发基础 本章将为读者介绍 MySQL 数据库相关的开发基础,首先,介绍一些基础概念,然后讲解关系数据模型和 SQL 基础.由于在互联网开发者中,PHP 开发者占据了相当大的比重,因此这里也将简要介绍下 PHP 开发者应该掌握的一些基础知识和开发注意事项.最后,要接触的是 MySQL 数据库

《MySQL DBA修炼之道》——3.5 索引

3.5 索引 3.5.1 索引介绍 数据库索引,是数据库管理系统中一个排序的数据结构,用于协助快速查询.更新数据库表中的数据.它类似于书本上的索引,通过索引可以更便捷地找到书里面的内容而不需要查阅整本书.对于海量数据的检索,索引往往是最有效的. 目前MySQL主要支持的几种索引有:B树索引(B-tree).散列索引(hash).空间索引(R-tree)和全文索引(full-text).如果没有特别指明,本书指的就是B-Tree索引.由于索引是在存储引擎层实现的,所以不同的存储引擎的索引实现会有一

《MySQL DBA修炼之道》——3.2 数据模型

3.2 数据模型 3.2.1 关系数据模型介绍     目前数据库领域使用最广泛的就是关系数据模型,业内主流的数据库产品都是建立在关系数据模型之上的,如Oracle.MS SQLServer.MySQL.PostgreSQL.DB2.关系型数据库系统的技术发展了几十年,已经相当成熟,在数据库中也得到了高效的实现.关系型数据库管理系统的标准语言--结构化查询语言(SQL),是一种高级的非过程化编程语言,它已经成为事实上的工业标准而被广泛使用,而且也变成了一项必须被程序员掌握的标准技能.     下

《MySQL DBA修炼之道》——3.3 SQL基础

3.3 SQL基础 SQL是一种高级查询语言,它是声明式的,也就是说,只需要描述希望怎么获取数据,而不用考虑具体的算法实现.3.3.1 变量 MySQL里的变量可分为用户变量和系统变量.1.用户变量 用户变量与连接有关.也就是说,一个客户端定义的变量不能被其他客户端看到或使用.当客户端退出时,该客户端连接的所有变量将自动释放.这点不同于在函数或存储过程中通过DECLARE语句声明的局部变量,局部变量的生存周期在它被声明的"BEGIN-END"块内.对于用户变量的值,可以先保存在用户变量

《MySQL DBA修炼之道》——1.6 存储引擎简介

1.6 存储引擎简介 运行如下命令可查看表的引擎. mysql> show table status like 'sys_accont' \G 1. row ** Name: sys_accont Engine: InnoDB 其中,Engine栏位表示使用的是何种引擎. MySQL不同于其他数据库,它的存储引擎是"可插拔"的,意思就是MySQL Server的核心基础代码和存储引擎是分离的,你可以使用最适合应用的引擎,也就是说MySQL支持不同的表使用不同的引擎.MySQL拥有

《MySQL DBA修炼之道》——1.5 长连接、短连接、连接池

1.5 长连接.短连接.连接池 当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了.可以查阅程序语言手册来获知通过何种方式使用短连接.长连接.1.5.1 短连接 短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭.短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接→数据传 输→关闭连接. 在慢速网络下使用短连接

《MySQL DBA修炼之道》——3.4 PHP开发

3.4 PHP开发 3.4.1 概述 一般的流行语言,如PHP.C.Perl.Java都对MySQL提供了完善支持,这其中PHP是最常用的使用MySQL数据库的语言,互联网普遍使用的是LAMP/LNMP架构,这里的P可以理解为就是PHP,可以说PHP的应用范围相当广泛,尤其是在Web程序的开发上,比如,我们熟知的Facebook,就是PHP.MySQL的重度使用者.作为互联网开发者,我们有必要熟悉MySQL在各种语言环境下的使用,尤其是PHP. 以下简要介绍PHP与MySQL开发,PHP(全称为

《MySQL DBA修炼之道》——1.2MySQL 的基础架构和版本

第1章 理解MySQL 1.2MySQL 的基础架构和版本 1.2.1 软件架构中数据库的定位 数据库一般位于整个软件架构的后端,而不直接服务于用户,数据的展示.应用逻辑的处理都是由其他层次的程序来实现的.比较流行的一种软件架构的分类是"双层"."三层"."多层"架构.客户端直接和数据库服务器通信,比如通过ODBC.JDBC连接数据库,一般称为"双层架构"或"client-server"架构.若客户端和数据