mysql 基础

一、字符串使用

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 DELETEON 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。

**使用场景:**当查询的字段全部位于索引中时,数据库可以直接从索引中读取数据,无需访问实际的数据行。

作用总结:

加速查询 :通过索引快速定位到数据,减少扫描全表的时间。

排序和分组 :索引可以辅助数据库进行排序和分组操作,提高效率。

确保唯一性: 主键和唯一索引可以防止插入重复数据。

选择使用场景时,需要根据数据的特性和查询模式来决定最适合的索引类型,同时也要注意索引会占用额外的存储空间,并可能影响插入、删除和更新操作的性能。因此,索引的设计需要权衡查询性能和维护成本。

相关推荐
tatasix几秒前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。13 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了14 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度16 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮18 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康2 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王2 小时前
《MySQL 数据库备份与恢复》
mysql