一、字符串使用
VARCHAR用于存储可变长字符串,它比定长类型更节省空间,使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用 1字节表示,否则使用2字节表示。 存储的内容超出设置的长度时,内容会被截断。
CHAR是定长的,根据定义的字符串长度分配足够的空间。 CHAR会根据需要使用空格进行填充方便比较。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度。 CHAR存储的内容超出设置的长度时,内容同样会被截断。
尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。
二、日期类型
若要设置日期字段自动更新,通常是指设置一个TIMESTAMP或DATETIME类型的字段,在记录被创建或每次更新时自动填充当前时间。
1. 设置自动创建时间和自动更新时间
创建时间(CreatTime):
类型:TIMESTAMP 或 DATETIME
默认值:CURRENT_TIMESTAMP
sql
-- 创建时设置时间字段
CREATE TABLE your_table (
id INT PRIMARY KEY,
content VARCHAR(255),
creat_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 添加或修改创建时间字段
ALTER TABLE your_table
ADD COLUMN creat_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
2. 更新时间(UpdateTime)
类型:TIMESTAMP 或 DATETIME
默认值:CURRENT_TIMESTAMP,并开启ON UPDATE CURRENT_TIMESTAMP
sql
CREATE TABLE your_table (
id INT PRIMARY KEY,
content VARCHAR(255),
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 添加或修改更新时间字段
ALTER TABLE your_table
MODIFY COLUMN update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
三、distinct、count
distinct:过滤distinct后面跟着的字段,当每个字段都相同时,才过滤。
cout(*):返回满足条件的总记录数。
count(列):返回满足条件的列,但不统计列为null 的记录。
四、其他总结
1. 复合主键
复合主键的各个列的值组合起来必须是唯一的,不允许有两行记录在所有组成主键的列上具有相同的值组合。
当单个列无法唯一标识表中的记录时,就需要使用复合主键 。组成复合主键的每个列值都不能为NULL,因为NULL值不能参与唯一性判断。
sql
CREATE TABLE ExampleTable (
column1 datatype,
column2 datatype,
PRIMARY KEY (column1, column2) //设置复合主键
);
复合主键是一种设计选择,用于处理那些单列无法满足唯一性要求的表结构,确保数据完整性的同时适应复杂的业务逻辑需求。
2. not null 与unique
NOT NULL 和 UNIQUE 是数据库表设计中用于约束列值的两个重要属性。
NOT NULL
含义 :NOT NULL 约束指示某列不能存储NULL值 ,即该列必须包含一个具体的值。
目的 :确保数据的完整性,避免遗漏重要信息。对于某些列,如果缺少值就没有意义或者不符合业务逻辑,这时就会使用NOT NULL约束。
应用 :经常用于关键数据如用户ID、订单日期等,这些列通常被认为是必须填写的。
UNIQUE
含义 :UNIQUE 约束要求该列中的所有值都是唯一的 ,不允许有重复的值出现。但是,UNIQUE约束允许有一个NULL值 ,因为NULL不与任何值(包括另一个NULL)相等。
目的 :防止输入重复数据,保证数据的唯一性, 适用于需要唯一标识但不一定是主键的列。
应用:常用于邮箱地址、用户名等需要确保不重复的字段。
比较
共同点: 两者都是为了提升数据的质量和完整性,限制数据的输入。
区别: N**OT NULL强调的是列不能缺少值,而UNIQUE强调的是列中的值不能重复。**一个列可以同时是NOT NULL和UNIQUE,这意味着它既不能为空,也不能有重复值。
在实际应用中,根据业务需求和数据完整性要求,可以灵活结合使用这两个约束条件。例如,一个用户的电子邮件地址可能需要同时设置为NOT NULL和UNIQUE,以确保每个用户都提供了且提供的邮件地址是唯一的。
3. 设置外键
MySQL中的外键(Foreign Key)是一种约束,用于建立两个表之间的关系,确保一个表中的数据与另一个表中的数据保持参照完整性。
定义与作用:
外键定义在一个表(从表或子表)上,引用另一个表(主表或父表)的主键或唯一键。
作用是维护两个表之间的数据一致性,确保当在从表中插入或更新记录时,相应的记录必须存在于主表中。
在创建表时定义:
sql
CREATE TABLE ChildTable (
child_id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES ParentTable(parent_id)
-- 可选: ON DELETE CASCADE ON UPDATE CASCADE
);
或者在表创建后添加:
sql
ALTER TABLE ChildTable
ADD FOREIGN KEY (parent_id) REFERENCES ParentTable(parent_id);
级联操作:
ON DELETE 和 ON UPDATE 规定当主表中的记录被删除或更新时,从表中的相关记录如何响应。
CASCADE :从表中的相关记录也将被删除或更新。
SET NULL :从表中的外键字段被设置为NULL。
RESTRICT :如果子表中有匹配项,则拒绝删除或更新主表的记录。
NO ACTION :MySQL中与RESTRICT效果相同。
注意事项:
在设计数据库时,合理使用外键可以增强数据的一致性,但也可能影响插入、更新和删除操作的性能。
在一些高性能应用场景下,为了追求速度,可能会选择不使用外键约束,而是通过应用程序层面来维护这种关系。
4. 枚举
MySQL中的枚举类型(ENUM )是一种特殊的字符串数据类型,它允许你为一列定义预设的固定值集合,从而限制该列的输入只能是这些预设值之一。
定义枚举:gender列只能接受'male'、'female'或'other'这三个值。
sql
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(100),
gender ENUM('male', 'female', 'other')
);
插入数据:直接使用枚举列表中的字符串即可
sql
INSERT INTO Users (name, gender) VALUES ('Alice', 'female');
如果需要向枚举中添加或删除值 ,需要使用ALTER TABLE 命令,但要注意这可能会影响到已有的数据。如果删除了一个枚举选项,而表中已经有该值的记录,那么这些记录的该字段值会被自动置为空字符串('')。
注意事项:
枚举列表中的值按照定义顺序排列,并且每个值都有一个索引,第一个值索引为1,依此类推。这在使用ORDER BY时会有所体现。
更改枚举选项可能需要重新评估表中的数据,以避免非法值的问题。
枚举类型的修改可能会影响存储空间和查询性能,特别是在大型表中。
枚举不适合那些可能频繁变动的值集合。
5. 自增长 AUTO_INCREMENT
为表的某个字段设置自增长(AUTO_INCREMENT)属性可以让数据库自动为其生成唯一的数字标识符,通常用于作为主键。
sql
CREATE TABLE Orders (
orderId INT AUTO_INCREMENT PRIMARY KEY,
orderDate DATE,
AUTO_INCREMENT = 1001; -- 设置起始值为1001
);
默认情况下,自增长的起始值是1 ,并且每次增加1。也可以自定义起始值和增量。插入新记录后,可以使用**LAST_INSERT_ID()**函数获取最后自动生成的ID值。例如:
sql
INSERT INTO Users (username) VALUES ('Alice');
SELECT LAST_INSERT_ID();
自增长特性主要由MySQL的存储引擎支持,如InnoDB和MyISAM。InnoDB 引擎从MySQL 5.1开始成为默认引擎,它支持事务处理和行级锁定,同时也支持自增长。
注意事项:
自增长字段应尽量定义为整数类型,如INT、BIGINT等。
如果表中已有数据,且自增长字段不是最大值,新插入的记录可能会导致ID不连续。
在复制环境中,自增长ID的管理需要特别注意,以避免ID冲突。
五、索引
MySQL中的索引是用于加速数据检索的一种数据结构,它们通过减少必须检查的行数来提高查询性能。
1. 主键索引(Primary Key Index)
作用 :用于唯一标识表中的每一行记录,不允许有重复值和NULL值。
使用场景 :作为表的主键,确保数据的唯一性和组织数据的物理顺序(InnoDB引擎中为聚集索引 )。
2. 唯一索引(Unique Index)
作用 :保证索引列的值唯一,允许有一个NULL值 。
使用场景 :适合用于需要确保数据唯一性但不作为主键的列 ,如邮箱地址。
3. 普通索引(Index)
作用: 加快查询速度,无唯一性要求 。
使用场景: 适用于经常出现在WHERE子句中的列 ,以加速查询。
4. 全文索引(Full-text Index)
作用 :用于全文搜索,支持复杂的文本搜索操作,如模糊匹配、相关性排序。
使用场景 :适用于文本内容较多的列,如文章内容、评论等,进行全文搜索时。
5. 组合索引(Composite Index)或多列索引
作用 :基于多个列创建的索引,可以加速涉及这些列的查询。
使用场景: 当查询条件经常同时包含多个列时,可以显著提高查询效率。
6. 空间索引(Spatial Index)
作用 :针对空间数据类型 (如POINT、LINESTRING、POLYGON等)的索引,加速地理空间数据的查询。
使用场景 :地图应用、地理信息系统(GIS)等,需要进行空间位置查询或范围查询。
7. 覆盖索引(Covering Index)
概念:并非独立的索引类型,而是一种索引策略, 指查询所需的所有列都包含在索引中,无需回表查询。
作用: 进一步提升查询速度,减少磁盘I/O。
**使用场景:**当查询的字段全部位于索引中时,数据库可以直接从索引中读取数据,无需访问实际的数据行。
作用总结:
加速查询 :通过索引快速定位到数据,减少扫描全表的时间。
排序和分组 :索引可以辅助数据库进行排序和分组操作,提高效率。
确保唯一性: 主键和唯一索引可以防止插入重复数据。
选择使用场景时,需要根据数据的特性和查询模式来决定最适合的索引类型,同时也要注意索引会占用额外的存储空间,并可能影响插入、删除和更新操作的性能。因此,索引的设计需要权衡查询性能和维护成本。