1.事务
为什么要有事务????
事务广泛的运用于订单系统、银行系统等多种场景 例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
- 检查A的账户余额>500元;
- A 账户中扣除500元;
- B 账户中增加500元;
正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败 。事务的需求就在于此
所谓事务,它是一个操作序列 ,这些操作要么都执行,要么都不执行 ,它是一个不可分割的工作单位。
例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
事务命令 要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎查看表的创建语句,可以看到engine=innodb show create table students; 修改数据的命令会触发事务,包括insert、update、delete
开启事务,命令如下: 开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中 begin;
提交事务,命令如下 : 将缓存中的数据变更维护到物理表中 commit;
回滚事务,命令如下: 放弃缓存中变更的数据 rollback;
2. 索引
思考:在图书馆中是如何找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引
语法
记录时间
开启时间检测
set profiling=1;
查看执行时间
show profiling;
查看索引
show index from 表名;
创建索引
- 方式一:建表时创建索引
create_index 对类型primary key(主键)、unique(唯一)都会自动创建索引,要想指定字段创建索引,则在生成表的时候用以下语法
key(指定字段)
create table create_index(
id int primary key,
name varchar(10) unique,
age int,
key (age)
);
- 方式二:对于已经存在的表,添加索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致 字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度))
例:
create index age_index on create_index(age);
create index name_index on create_index(name(10));
删除索引:
drop index 索引名称 on 表名;
缺点 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件但是,在互联网应用中,查询的语句远远大于增删改的语句,甚至可以占到80%~90%,所以也不要太在意,只是在大数据导入时,可以先删除索引,再批量插入数据,最后再添加索引
|