MySQL索引以及事务
一.索引
-
索引介绍
索引用于快速找出在某个列中有一特定值的行。
不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
索引也不易过多,索引越多写入,修改的速度越慢。因为,写入修改数据时,也要修改索引
MySQL中,所有数据类型的列都可以被索引,常用的存储引擎InnoDB和MyISAM能支持每个表创建16个索引。
二.索引分类
查看索引
基本语法:
show index from tablename;
示例:
show index from user\G;
示例说明:
查看user表的索引结构
mysql> show index from user\G; # 查看索引
*************************** 1. row ***************************
Table: user
Non_unique: 0
Key_name: PRIMARY # 主键约束 主键索引
Seq_in_index: 1
Column_name: id # 使用主键约束的字段
Collation: A
Cardinality: 94891
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
*************************** 2. row ***************************
Table: user
Non_unique: 0
Key_name: name1
Seq_in_index: 1
Column_name: name1 #使用约束的字段
Collation: A
Cardinality: 90334
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
2 rows in set (0.51 sec)
-
普通索引
最基本的索引,没有任何限制
基本语法:
alter table 表 add index(字段)
示例:
alter table money add index(username);
示例说明:
为money表的username字段增加索引
-
唯一索引
某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的 unique
基本语法: alter table 表 add unique(字段) 示例: alter table money add unique(email); 示例说明: 为money表的email字段增加唯一索引
-
主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码 primary key.
基本语法:
alter table 表 add primary key(字段)
示例:
alter table money add primary key(id);
示例说明:
为money表的id字段增加主键索引
-
删除索引
基本语法: ALTER TABLE table_name DROP INDEX index_name 示例: alter table money drop index age; 示例说明: 为money表删除age索引
三. 事务
我们每执行一条SQL语句,每执行一组SQL语句,我们都可以称为事务.
事务可以看作是一个“容器”,将多条语句,放入该容器,最后,只要一个命令行,来决定其中的所有语句是否“执行” .
1.事务四大特征
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):
原子性(Atomicity) 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
一致性(Consistency)事务应确保数据库的状态从一个一致状态转变为另一个一致状态
隔离性(Isolation)多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性(Durability)已被提交的事务对数据库的修改应该永久保存在数据库中
-
事务模式
在mysql中默认一条sql语句一个事务
因此,如果需要开启事务模式的话
使用 start transaction开头,开启事务模式
使用 commit 语句执行后,才能真正生效
使用 rollback 语句进行回滚start transaction ; insert into student(name,age,stuid) values('lili','18',1001) # 执行提交就存入进数据库 commit # 不需要插入就执行rollback 撤回 rollback