参考: https://open.alipay.com/portal/forum/post/129501140
主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询。
主键
在这里插入代码片
主键是一种用于唯一标识表中每一行数据的标识符。在Mysql中,主键可以是一个或多个列的组合,但是必须满足以下条件:
- 主键列的值必须唯一,不能重复。
- 主键列的值不能为空,不能为NULL。
- 一个表只能有一个主键。
主键可以用于加速查询和提高数据的完整性和安全性。在Mysql中,主键可以通过两种方式定义
在创建表时定义主键
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在已有表中添加主键
ALTER TABLE `users` ADD PRIMARY KEY (`id`);
外键
外键是一种用于建立表与表之间关联关系的机制。外键可以用于保证数据的完整性和一致性。在Mysql中,外键可以通过两种方式定义
在创建表时定义外键
创建表时,可以通过在列定义后面添加FOREIGN KEY关键字来定义外键
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`quantity` int(11) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,orders表中的user_id和product_id列被定义为外键,分别引用了users表和products表中的id列。
在已有表中添加外键
ALTER TABLE `orders` ADD FOREIGN KEY (`user_id`) REFERENCES `users`(`id`);
索引
索引是一种用于加速查询的机制。在Mysql中,索引可以用于提高查询效率和保证数据的完整性和一致性。
索引建立的规则:
参考: https://bbs.huaweicloud.com/blogs/340295
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
- 正确选择复合索引中的主列字段,一般是选择性较好的字段;
- 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大
PRIMARY KEY索引
PRIMARY KEY索引是一种用于唯一标识表中每一行数据的索引。在Mysql中,每个表只能有一个PRIMARY KEY索引
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UNIQUE索引
UNIQUE索引是一种用于限制列中的数据不能重复的索引。在Mysql中,每个表可以有多个UNIQUE索引
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,email列被定义为UNIQUE索引
INDEX索引
INDEX索引是一种用于加速查询的索引。在Mysql中,每个表可以有多个INDEX索引
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
INDEX `idx_name` (`name`),
INDEX `idx_email` (`email`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
FULLTEXT索引
FULLTEXT索引是一种用于全文搜索的索引。在Mysql中,每个表只能有一个FULLTEXT索引
CREATE TABLE `articles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
`content` text NOT NULL,
FULLTEXT INDEX `idx_content` (`content`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
约束
约束是一种用于限制表中数据的规则。在Mysql中,约束可以用于保证数据的完整性和一致性。Mysql支持以下几种约束:
NOT NULL约束
NOT NULL约束用于限制列中的数据不能为NULL
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
UNIQUE约束
UNIQUE约束用于限制列中的数据不能重复。例如:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CHECK约束
CHECK约束用于限制列中的数据必须满足指定的条件。:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
CHECK (`age` >= 18),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DEFAULT约束
DEFAULT约束用于指定列的默认值。例如:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;