linux系统----------MySQL索引浅探索

news2024/9/22 21:35:17

目录

一、数据库索引介绍

二、索引的作用

索引的副作用 (缺点)

三、创建索引的原则依据

四、索引的分类和创建

4.1普通索引

4.1.1直接创建索引

4.1.2修改表方式创建

4.1.3创建表的时候指定索引

4.2唯一索引

4.2.1直接创建唯一索引

4.2.2修改表方式创建

4.2.3创建表的时候指定

4.3主键索引

4.3.1创建表的时候指定

​4.3.2修改表方式创建

4.4组合索引 (单列索引与多列索引)

4.5全文索引(FULLTEXT)

4.5.1直接创建索引

4.5.2修改表方式创建

4.5.3创建表的时候指定索引

4.5.4使用全文索引查询

五、查看索引

六、删除索引

6.1直接删除索引

6.2修改表方式删除索引

6.3删除主键索引

七、MySQL事务

7.1MySQL事务的概念

7.2事务的ACID特点


一、数据库索引介绍

①是一个排序的列表,存储着索引值和这个值所对应的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)

②无须对整个表进行扫描,通过物理地址就可以找到所需数据

③是表中一列或者若干列值排序的方法

④需要额外的磁盘空间

建立索引的目的是加快对表中记录的查找或排序

索引就是一种帮助系统更快查找信息的数据

索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容

二、索引的作用

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。

●当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。

●可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。

●通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性。

●可以加快表与表之间的连接。

●在使用分组和排序时,可大大减少分组和排序的时间。

索引也是优化的一种,相当于快捷方式

索引的副作用 (缺点)

索引需要占用额外的磁盘空间

对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而InnoDB 引擎的表数据文件本身就是索引文件。当表很大或查询涉及到多个表时,可以成干上万倍地提高查询速度

在插入和修改数据时要花费更多的时间,因为索引也要随之变动

① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大

② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)

③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

三、创建索引的原则依据

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

●表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位

●记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。

●经常与其他表进行连接的表,在连接字段上应该建立索引。

●唯一性太差的字段不适合建立索引。

●更新太频繁地字段不适合创建索引。

●经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
select name,score from ky19 where id=1

●索引应该建在选择性高的字段上。

●索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

MySQL 的优化 哪些字段/场景适合创建索引,哪些不适合?
1、小字段
2、唯一性强的字段
3、更新不频繁,但查询率很高的字段
4、表记录超过300+行
5、主键、外键、唯一键

四、索引的分类和创建

[root@localhost ~]#mysql -uroot -p123123

mysql> show databases;

mysql> create database class;

mysql> use class;

mysql> create table ky11 (id int(5),name char(8) not null,cardid varchar(18),phone varchar(11),address char(400),remark text);   #创建表ky11   remark text #备注信息

mysql> insert into ky11 values(1,'jian',11111111,15652782456,'nanjing','this is vip'); 

          #插入数据

mysql> insert into ky11 values(2,'xzn',2222221,15652783568,'beijing','this is vvip');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(3,'sbn',2226621,15666383568,'beijing','this is vvvip');
Query OK, 1 row affected (0.01 sec)

准备:

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.17 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;    #查看有哪些库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> create database class;   #创建库
Query OK, 1 row affected (0.01 sec)
mysql> use class;   #切换库
Database changed
mysql> create table ky11 (id int(5),name char(8) not null,cardid varchar(18),phone varchar(11),address char(400),remark text);     #创建表
Query OK, 0 rows affected (0.02 sec)
mysql> insert into ky11 values(1,'jian',1111111,15652782456,'nanjing','this is vip'); 
      #插数据
Query OK, 1 row affected (0.00 sec)
mysql> insert into ky11 values(2,'xzn',2222221,15652783568,'beijing','this is vvip');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(3,'sbn',2226621,15666383568,'beijing','this is vvvip');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(4,'zj',3226621,19666383568,'wuhan','this is vip');
Query OK, 1 row affected (0.00 sec)
mysql> insert into ky11 values(5,'dzq',1126621,13266384568,'shenzhen','gao er fu');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(6,'cwt',3326621,13267324568,'shanghai','chang ge');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(7,'ngmt',3426621,16967324568,'beijing','this is vvvip');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ky11 values(8,'khui',1126621,15667326868,'xian','this is yue du');
Query OK, 1 row affected (0.00 sec)
mysql> select * from ky11;   #查看ky11表
+------+------+---------+-------------+----------+----------------+
| id   | name | cardid  | phone       | address  | remark         |
+------+------+---------+-------------+----------+----------------+
|    1 | jian | 1111111 | 15652782456 | nanjing  | this is vip    |
|    2 | xzn  | 2222221 | 15652783568 | beijing  | this is vvip   |
|    3 | sbn  | 2226621 | 15666383568 | beijing  | this is vvvip  |
|    4 | zj   | 3226621 | 19666383568 | wuhan    | this is vip    |
|    5 | dzq  | 1126621 | 13266384568 | shenzhen | gao er fu      |
|    6 | cwt  | 3326621 | 13267324568 | shanghai | chang ge       |
|    7 | ngmt | 3426621 | 16967324568 | beijing  | this is vvvip  |
|    8 | khui | 1126621 | 15667326868 | xian     | this is yue du |
+------+------+---------+-------------+----------+----------------+
8 rows in set (0.00 sec)

mysql>
mysql> desc ky11;    #查看ky11表结构
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(5)      | YES  |     | NULL    |       |
| name    | char(8)     | NO   |     | NULL    |       |
| cardid  | varchar(18) | YES  |     | NULL    |       |
| phone   | varchar(11) | YES  |     | NULL    |       |
| address | char(40)    | YES  |     | NULL    |       |
| remark  | text        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> 

4.1普通索引

最基本的索引类型,没有唯一性之类的限制

4.1.1直接创建索引

CREATE INDEX 索引名 ON 表名 (列名[(length)]);
zhangsan 
#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾

示例:

create index address_index on ky11(address);    #创建索引

select address from ky11;       #生效索引

show create table ky11;          #查看索引

4.1.2修改表方式创建

alter修改数据结构的时候创建索引

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

示例:

alter table ky11 add index phone_index (phone);

show create table ky11;

select phone from ky11;

4.1.3创建表的时候指定索引

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

示例:

create table biao01(id int(4) not null,name varchar(6),cardid varchar(18) not null,index id_index(id));             #创建表(biao01)时添加索引

show create table biao01;

4.2唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一
唯一索引允许有空值(注意和主键不同)

如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

4.2.1直接创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名(列名);

例:UNIQUE
create unique index address_index on ky20 (address);--------
create unique index name_index on ky20 (name);  

 # 创建    唯一    索引    索引名     on   表名(字段)                 
show create table ky20;     #查看索引

mysql> create unique index name_index on ky11(name);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table ky11;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ky11  | CREATE TABLE "ky11" (
  "id" int(5) DEFAULT NULL,
  "name" char(8) NOT NULL,
  "cardid" varchar(18) DEFAULT NULL,
  "phone" varchar(11) DEFAULT NULL,
  "address" char(40) DEFAULT NULL,
  "remark" text,
  UNIQUE KEY "name_index" ("name"),
  KEY "address_index" ("address"),
  KEY "phone_index" ("phone")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

4.2.2修改表方式创建

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

示例

alter table ky11 add unique id_index(id);

#修改字段 table 表名 add  唯一  索引名(字段)


4.2.3创建表的时候指定

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

示例:

create table amd2 (id int,name varchar(20),unique id_index (id));
show creat table amd2;

create table test2 (id int,name varchar(40),age int(5),primary key (id));

create table biao02(id int(3),name char(6) not null,unique name_index(name));


4.3主键索引

是一种特殊的唯一索引,必须指定为“PRIMARY KEY”
一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

4.3.1创建表的时候指定

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

例:create table test1 (id int primary key,name varchar(20));
create table test2 (id int,name varchar(20),primary key (id));

show create table test1;
show create table test2;

create table biao03(id int,name char(6),primary key (id)); 


4.3.2修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

alter table ky11 add primary key(cardid);

一般主键索引是开发的时候就创建好了

4.4组合索引 (单列索引与多列索引)

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

格式:

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

示例:

create table amd1 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table amd1;
insert into amd1 values(1,'zhangsan','123123');
nsert into amd1 values(1,'zhangsan','123123');

create table biao04(id int not null,name varchar(8),cardid char(20),index index_biao04 (name,id));

小结:
组合索引创建的字段顺序是其触发索引的查询顺序
例如:
--+
| test3 | CREATE TABLE "test3" (
  "id" int(11) NOT NULL,
  "name" varchar(50) DEFAULT NULL,
  "age" int(5) DEFAULT NULL,
  KEY "index_idname" ("id","name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
对以上的表进行select 
select id,name from test3;            #会触发组合索引
而select name,id from test3;            #按照索引从左到右检索的顺序,则不会触发组合索引

4.5全文索引(FULLTEXT)

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息
在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引

4.5.1直接创建索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

示例:

create fulltext index remark_index on ky11(remark);

select * from ky11;

create fulltext index remark_index on ky11(remark);

4.5.2修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

4.5.3创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名)); 
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

4.5.4使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

例:select * from ky11 where match(remark) against('this is vip');
or select * from ky11 where remark='this is vip';

select * from ky11 where remark='this is vvvip';
                   加条件  备注  

索引分类为:
① 普通索引 :针对所有字段,没有特殊的需求/规则
② 唯一索引 : 针对唯一性的字段,仅允许出现一次空值
③ 组合索引 (多列/多字段组合形式的索引)
④ 全文索引(varchar char text)MySQL为了优化对文本内容搜索的一种机制
⑤ 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

创建索引:  (即创建索引的三种方式)
① 在创建表的时候,在末尾直接指定index
② alter修改表结构的时候,进行add 添加index
③ 直接创建索引index
PS:主键索引——》直接创建主键即可

五、查看索引

show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;

show create table 表名;   

show index from ky11;

show index from 表名\G; 竖向显示表索引信息

mysql> show index from ky11\G;
*************************** 1. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: cardid
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: id_index
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 4. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: address_index
 Seq_in_index: 1
  Column_name: address
    Collation: A
  Cardinality: 6
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 5. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: phone_index
 Seq_in_index: 1
  Column_name: phone
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 6. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: remark_index
 Seq_in_index: 1
  Column_name: remark
    Collation: NULL
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
6 rows in set (0.00 sec)

ERROR: 
No query specified

mysql>

show keys from 表名;

各字段的含义如下:

Table    表的名称
Non_unique    如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
Key_name    索引的名称。
Seq_in_index    索引中的列序号,从 1 开始。 limit 2,3
Column_name    列名称。
Collation    列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality    索引中唯一值数目的估计值。
Sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。如果整列被编入索引,则为 NULL 
Packed    指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null    如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment    备注。

show keys from 表名\G;

mysql> show keys from ky11\G;
*************************** 1. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: cardid
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: ky11
   Non_unique: 0
     Key_name: id_index
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 4. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: address_index
 Seq_in_index: 1
  Column_name: address
    Collation: A
  Cardinality: 6
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 5. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: phone_index
 Seq_in_index: 1
  Column_name: phone
    Collation: A
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 6. row ***************************
        Table: ky11
   Non_unique: 1
     Key_name: remark_index
 Seq_in_index: 1
  Column_name: remark
    Collation: NULL
  Cardinality: 8
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
6 rows in set (0.00 sec)

ERROR: 
No query specified

mysql>

show create table 表名;   

mysql> show create table ky11;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ky11  | CREATE TABLE "ky11" (
  "id" int(5) DEFAULT NULL,
  "name" char(8) NOT NULL,
  "cardid" varchar(18) NOT NULL,
  "phone" varchar(11) DEFAULT NULL,
  "address" char(40) DEFAULT NULL,
  "remark" text,
  PRIMARY KEY ("cardid"),
  UNIQUE KEY "name_index" ("name"),
  UNIQUE KEY "id_index" ("id"),
  KEY "address_index" ("address"),
  KEY "phone_index" ("phone"),
  FULLTEXT KEY "remark_index" ("remark")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

六、删除索引

6.1直接删除索引

DROP INDEX 索引名 ON 表名;

示例:

drop index name_index on ky11;

6.2修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

示例:

alter table ky11 drop index id_index;   #修改表方式删除索引

show create table ky11;      #查看索引

6.3删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

alter table ky11 drop primary key;

七、MySQL事务

7.1MySQL事务的概念

MySQL 事务主要用于处理操作量大,复杂度高的数据

比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。这样,这些数据库操作语句就构成一个事务!

●事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。


●事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

●事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

●事务是通过事务的整体性以保证数据的一致性。

说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

7.2事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

●原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

事务是一个完整的操作,事务的各元素是不可分的。
事务中的所有元素必须作为一个整体提交或回滚。
如果事务中的任何元素失败,则整个事务将失败。

案例:
A给B转帐100元钱的时候只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么都执行,要么就都不执行。

●一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

当事务完成时,数据必须处于一致状态。
在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。
当事务成功完成时,数据必须再次回到已知的一致状态。


案例:
对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致。

●隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

●持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

指不管系统是否发生故障,事务处理的结果都是永久的。
一旦事务被提交,事务的效果会被永久地保留在数据库中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——du, df命令查看磁盘空间使用情况

一、实现原理: df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目…

Qt QGraphicsView移动、缩放

原链接 首先需要明白,view在整个视图框架中的角色是用于显示scene的,所以决定了如何展示scene,包括scale()函数,用于放大缩小所展示的scene;centerOn()函数,决定scene的中心在何方。所有的操作&#xff0c…

移动app测试的好处简析,有必要选择第三方软件测试机构吗?

移动app测试是指对移动应用程序进行全面、系统和深入的检查和验证,以确保其功能、性能和稳定性达到预期要求。在移动应用市场日益竞争激烈的今天,进行移动app测试是至关重要的。 一、移动app测试的好处:   1、具有确保应用质量的作用。通过…

集简云新增“AI图像生成与识别”功能:实现智能图像识别与理解场景

自OpenAI发布GPT-4V以来,也掀起了各大企业对于多模态大模型的研究热潮。和以往的生图模型相比,多模态模型已突破文本限制,图像理解和识别能力尤为突出。 本周,集简云上线AI图像识别与问答功能,集成OpenAI和Anthropic两…

复制浏览器请求到Postman

目录 1.复制链接 2.导入到Postman 1.复制链接 F12打开开发者模式 2.导入到Postman 如上图所示,参数及cookie等信息都被导入进来。

VUE自己项目做的时候遇到的疑惑问题

晚上还在疑惑为什么下面还有一个一模一样的 早上起来,神清气爽,想了一下。原来是我用了两个路由出口

C语言复杂度(个人笔记)

时间复杂度主要衡量一个算法的运行快慢. 空间复杂度主要衡量一个算法运行所需要的额外空间. 时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度. 只需要大概执行次数,我们使用大O的渐进表示法。(看谁对数学表达式的影响最大) 空间复杂度 是…

学习C++是否有必要学习Boost库?

C作为一门强大且灵活的编程语言,在软件开发领域有着广泛的应用。而在C的学习过程中,Boost库是一个经常被提及的重要资源。那么,对于C的学习者而言,是否有必要投入精力去学习Boost库呢?本文将就此问题展开详尽讨论。 一…

LVGL:拓展部件——键盘 lv_keyboard

一、概述 此控件特点: 特殊Button矩阵:lv_keyboard 本质上是一个经过定制的按钮矩阵控件。每个按钮都可以独立触发事件或响应。预定义的键映射:lv_keyboard 自带了一套预设的按键布局和对应的字符映射表,开发者可以根据需要选择…

js实现hash路由原理

一、简单的上下布局&#xff0c;点击左侧导航&#xff0c;中间内容跟对变化&#xff0c;主要技术使用js检测路由的onhashchange事件 效果图 二、话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"…

[Java、Android面试]_11_线程的启动方式和区别

文章目录 1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 使用Executor框架4. 四者的区别 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于…

Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件(1)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QLabel组件-显示图像或文本 2.2 QCalendarWidget组件-日历简单的使用 2.3 QLCDNumber组件-控件作时钟的显示 2.4 QProgressBar组件-模拟手机电池充电 2.5 QFrame组件-绘制水平/垂直线 Display Widgets将分…

【机器学习】基于树种算法优化的BP神经网络分类预测(TSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】树种优化算法&#xff08;TSA&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类别…

【vue-小知识】var、let 和 const之间的区别

文章目录 结论1、重复定义变量名var&#xff1a;允许重复定义变量名let和const&#xff1a;不可以重复定义变量名 2、修改值var&#xff1a;允许修改值let&#xff1a;允许修改值const&#xff1a;不允许修改值&#xff0c;会报错 3、变量提升var : 支持变量提升let和const&…

[ C++ ] STL---stack与queue

目录 stack简介 stack的常用接口 queue简介 queue的常用接口 stack的模拟实现 queue的模拟实现 stack简介 1. stack是具有后进先出操作的一种容器适配器&#xff0c;其只能从容器的一端进行元素的插入与删除操作&#xff1b; 2. stack是作为容器适配器被实现的&#xff0…

使用Barrier对齐ConstraintLayout几个控件的最高的一个

前提就是想让一个控件X&#xff0c;对齐A&#xff0c;B&#xff0c;C等控件最高的位置&#xff0c;直接看图。 看&#xff0c;由于name的一行&#xff0c;或者2行&#xff0c;会导致email行的高度&#xff0c;可能比image块高&#xff0c;也可能比image快矮。 那么&#xff…

【STC8A8K64D4开发板】第2-17讲:PCA实现数模转换(DAC)

第2-17讲&#xff1a;PCA实现数模转换&#xff08;DAC&#xff09; 学习目的了解DAC数模转换原理及RC积分电路原理。掌握STC8A8K64D4系列单片机实现DAC功能的硬件和软件设计。 DAC简介 DAC (全称是Digital to Analog Convertor)数模转换器是一种将数字信号转换为模拟信号&a…

vue3+threejs新手从零开发卡牌游戏(七):创建卡组

在开始前先优化下之前的代码&#xff1a; 在之前hand/p1.vue中为了定位 utils文件夹下新建common.ts&#xff0c;将一些公用方法提取出来放在这里&#xff1a; 在game/Cards.ts中&#xff0c;我们调整下卡牌的厚度&#xff0c;由原来的0.02改为0.005&#xff0c;原因是之前的…

ZHUTI主提2024夏季系列 —「逐·行」

ZHUTI主提全新发布2024夏季「逐行」系列&#xff0c;聚焦当下人与自然的关系&#xff0c;以衣为载体&#xff0c;秉承东方哲学的艺术理念&#xff0c;将美学艺术与主流时尚设计融合&#xff0c;赋予当代时装表达新方向&#xff0c;共创现代女性之美。 取自然之意境&#xff0c…

开发调试、远程访问、内网穿透解决方案集合

开发调试、远程访问、内网穿透解决方案集合 前言Cpolar下载安装配置与使用 Ngrok购买隧道下客户端配置与使用 ZeroTier注册与安装创建虚拟网络加入虚拟网络配置授权 花生壳Centos系统Ubuntu系统使用花生壳控制台SN码登录添加映射 Loophole通过CLI方式安装登录与注销简单使用身份…