MySQL约束及索引

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 在特定的数据库引擎下才有,mylsam快速定位数据

1.索引分类

1.主键索引 (primary key)

唯一标识,主键不可重复,只能有一个列作为主键

2.唯一索引 (unique key)

避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引

3.常规索引(key/index)

默认的,index,key关键字来设置

4.全文索引(fullText)

在特定的数据库引擎下才有,mylsam
快速定位数据

5.基础语法

在这里插入图片描述

2.建表测试

CREATE TABLE `app_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '用户昵称',
`email` varchar(50) NOT NULL COMMENT '用户邮箱',
`phone` varchar(20) DEFAULT '' COMMENT '手机号',
`gender` tinyint(4) unsigned DEFAULT '0' COMMENT '性别(0:男;1:女)',
`password` varchar(100) NOT NULL COMMENT '密码',
`age` tinyint(4) DEFAULT '0' COMMENT '年龄',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'

批量插入数据:100w

DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
  INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
   VALUES(CONCAT('用户', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
  SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();

索引效率测试

无索引

SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时
SELECT * FROM app_user WHERE name = '用户9999';
SELECT * FROM app_user WHERE name = '用户9999';

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: app_user
  partitions: NULL
        type: ALL
possible_keys: NULL
        key: NULL
    key_len: NULL
        ref: NULL
        rows: 992759
    filtered: 10.00
      Extra: Using where
1 row in set, 1 warning (0.00 sec)

创建索引

CREATE INDEX idx_app_user_name ON app_user(name);

测试普通索引

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: app_user
  partitions: NULL
        type: ref
possible_keys: idx_app_user_name
        key: idx_app_user_name
    key_len: 203
        ref: const
        rows: 1
    filtered: 100.00
      Extra: NULL
1 row in set, 1 warning (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

3.索引准则

索引不是越多越好

不要对经常变动的数据加索引

小数据量的表建议不要加索引

索引一般应加在查找条件的字段

约束

1.外键概念

外键:给关联字段创建关联就是添加外键,简单来说外键就是被约束条件

切记:作为外键一定要和关联主键的数据类型保持一致

--记录老师的数据表

CREATE TABLE Teachers(

id TINYINT PRIMARY KEY auto_increment,

name VARCHAR (20),

age INT,

gender boolean

);

--给老师添加数据

INSERT INTO Teachers (name,age,gender) VALUES ("Lily",12,0),

("Linta",14,0),

("Zahi",22,0),

("Paul",20,1),

("Jeans",21,1);

--创建学生的表

CREATE TABLE Students(

id INT PRIMARY KEY auto_increment,

name VARCHAR(20),

Teacher_id TINYINT,

FOREIGN KEY (Teacher_id) REFERENCES Teachers(id)

)ENGINE=INNODB;

--给学生添加数据

INSERT INTO Students (name,Teacher_id) VALUES ("ViewIn1",2),

("ViewIn2",4),

("ViewIn3",1),

("ViewIn4",3),

("ViewIn5",2),

("ViewIn6",3),

("ViewIn7",2),

("ViewIn8",4);

以上就是给Students的Teacher_id绑定外键为Teachers的id,这样就能将每一个学生与老师对应起来

2.关联约束

其中,Teacher是母表,Students是子表,无法单独删除母表中的字段,因为被子表约束了

要删除母表中的字段,必须将该字段的约束解除,即子表的外键不再对应该字段

因此可以选择修改作为外键的数据,来删除母表的某字段

比如要删除字段1,将Students中id=4和id=6(原本对应母表id=3)的Teacher_id值设置为4

—>这样子表中就没有与母表id=3的字段有关联了

update Students set Teacher_id=4 where id=4 or id=6;

—>之后再删除母表id=3的字段就不受影响了

delete from Teachers where id=3;

—>此时插入一个学生,绑定外键为3就会报错

INSERT INTO Students (name,Teacher_id) values ("ZaHuw",3);

3.添加与删除外键

给现成的表加外键

例:给Students创建一个外键,取名为aaa,外键字段为Teacher_id,将该外键关联到表Teachers的id字段

ALTER TABLE Students ADD CONSTRAINT aaa

FOREIGN KEY(Teacher_id)

REFERENCES Teachers(id);

2)删除已有的外键

ALTER TABLE Students drop foreign key aaa;

4.集联删除

设置集联删除:这样就不会被限制删除了;

如果删除了外键的字段,那它对应的外键也会跟着被删除;

如果删除了母表的字段,它对应的子表字段也会跟着被删除。

CREATE TABLE Students3(

id INT PRIMARY KEY auto_increment,

name VARCHAR(20),

Teacher_id TINYINT,

FOREIGN KEY (Teacher_id) REFERENCES Teachers(id) on DELETE CASCADE

)ENGINE=INNODB;

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
121 9
|
6天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
54 22
 MySQL秘籍之索引与查询优化实战指南
|
16天前
|
存储 SQL 关系型数据库
【MySQL基础篇】MySQL约束语法
文章介绍了MySQL中表的约束概念,包括非空、唯一、主键、默认和外键约束,以及如何在创建和修改表时指定这些约束。外键约束用于保持数据的一致性和完整性,文章通过示例展示了添加、删除外键的语法,并讨论了不同的删除/更新行为,如CASCADE和SETNULL。
【MySQL基础篇】MySQL约束语法
|
7天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
35 10
|
27天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
69 18
|
20天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
50 8
|
26天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
38 7
|
25天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
70 5
|
29天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
130 7
|
15天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
下一篇
开通oss服务