MySQL索引

自增长

auto_increment: 当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值 -> 通常与主键搭配,作为逻辑主键

  • 任何一个字段要做自增长,前提是本身是一个索引,(key 一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
mysql> create table auto_increment(
    -> id int unsigned primary key auto_increment,
    -> name varchar(10) not null
    -> );
mysql> insert into auto_increment(name) values('a');
Query OK, 1 row affected (0.02 sec)

mysql> insert into auto_increment(name) values('n');
Query OK, 1 row affected (0.00 sec)

mysql> select * from auto_increment;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | n    |
+----+------+
2 rows in set (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

​ 可以看到,当我们没有插入id时,因为有auto_increment 所以每次插入都会在上一次的基础上进行自增插入

mysql> insert into auto_increment values(122,'n');
Query OK, 1 row affected (0.01 sec)

mysql> insert into auto_increment(name) values('m');
Query OK, 1 row affected (0.01 sec)

mysql> select * from auto_increment;
+-----+------+
| id  | name |
+-----+------+
|   1 | a    |
|   2 | n    |
| 122 | n    |
| 123 | m    |
+-----+------+
4 rows in set (0.00 sec)

唯一键

  • 一张表中往往有 很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,所以需要有唯一键来保证其他不能重复的元素不出现重复的值
mysql> create table student (
   -> id char(10) unique comment '学号,不能重复,但可以为空',
   -> name varchar(10)
   -> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student(id, name) values('01', 'aaa');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student(id, name) values('01', 'bbb'); --唯一约束不能重复

ERROR 1062 (23000): Duplicate entry '01' for key 'id'

mysql> insert into student(id, name) values(null, 'bbb'); -- 但可以为空

Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+------+------+
| id   | name |
+------+------+
| 01   | aaa |
| NULL | bbb |
+------+------+

​ 唯一键允许为空,而且可以多个为空,空字段不做唯一比较。

外键

  • 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或者unique约束的。当定义外键之后,要求外键数据必须在主表的主键列存在或为nulll;

语法:

foreign key (字段名) references 主表(列)

在这里插入图片描述

mysql> create table class(
    -> id int primary key,
    -> name varchar(30) not null comment 'class name'
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> create table stu(
    -> id int primary key,
    -> name varchar(30) not null,
    -> class_id int,
    #建立外键,将从表中的class_id 绑定到 class中的id
    -> foreign key (class_id) references class(id)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> desc stu;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(30) | NO   |     | NULL    |       |
| class_id | int         | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into class values(1,101),(2,102);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from class;
+----+------+
| id | name |
+----+------+
|  1 | 101  |
|  2 | 102  |
+----+------+
2 rows in set (0.00 sec)

mysql> insert into stu values(100, '张三', 1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into stu values(101, '李四', 2);
Query OK, 1 row affected (0.01 sec)

#如果像插入到一个不存在的class_id是不允许的
mysql> insert into stu values(102, '李四', 3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

​ 这里像删除主表中的某个元素,就要保证从表中没有元素是绑定在这个主表上的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值