MySQL事物和索引

事物:
将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消
MySQL事物处理只支持InnoDB 和BDB 数据表类型
事物具备以下四个属性检查ACID属性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)

Set Autocommit
使用set 语句来改变自动提交模式
Set Autocommit=0 ; 关闭自动提交模式
中间写入对应事物语句
Set Autocommit=1; 开启自动提交模式
MySQL中默认是自动提交
使用事务时应先关闭自动提交
START TRANSACTION
开始一个事务,标记事务的起始点
COMMIT
提交一个事务给数据库
ROLLBACK
将事务回滚,数据回到本次事务的初始状态

事物 课堂实例:
delimiter &&
set autocommit=0;
start transaction;
update account set cash=cash-10000 where user_name=‘ICBC’;
update account set cash= cash+10000 where user_name=‘hanmeimei’;
select * from account;
select * from account_history;
rollback;
select * from account;
select * from account_history;
set autocommit=1;
&&

数据库索引:
作用:
提高查询速度,区别数据的唯一性,可以加速表和表之间的连接,实现表与表之间的参照完整性。
使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间

分类:
主键索引(PRIMARY KEY)
某一个属性组能唯一标识一条记录
特点:最常见的索引类型,确保数据记录的唯一性,确定特定数据记录在数据库中的位置
唯一索引(UNIQUE)
作用:避免同一个表中某数据列中的值重复
与主键索引的区别:主键索引只能有一个且不能为null,唯一索引可有多个,可以为null
常规索引(INDEX)
作用:快速定位特定数据
注意:index 和 key 关键字都可设置常规索引
应加在查找条件的字段,不宜添加太多常规索引,影响数据的插入、删除和修改操作
全文索引(FULLTEXT)
match (字段名)against (搜索信息);
作用:快速定位特定数据
注意:
只能用于MyISAM类型的数据表
只能用于CHSR、VARCHAR、TEXT数据列类型
适合大型数据集

添加索引
添加索引方式一:
创建表声明列属性时添加索引
添加索引方式二:
创建表,将所有类都声明完毕后,再添加索引
添加索引方式三:
先创建表,创建表完毕后,修改表添加索引
alter table 表名 add index(unique/primary key)
create index 索引名 on 表名 (字段名);
删除索引:
drop index 索引名 on 表名;
alter table 表名 drop index 字段名;
主键索引删除:
alter table 表名 drop primary key (字段名);

索引失效的情况:

1.模糊查询不能利用索引like
2.如果是组合索引的话 ,如果不按照索引的顺序进行查找,比如直接使用第三位置上的索引而忽略第一第二位置上的索引 则会进行全表查询
3.条件中有or
4.索引无法存储null 值 所以where 的判断条件如果对字段进行了null值判断,将导致数据库放弃索引而进行全表查询
select id from t where num is null;
可以在num上设置默认值0,确保表中num列没有null值然后这样查询
select id from t where num=0;
单列索引无法存储null值,复合索引无法存储全为null的值
查询时,采用is null条件时,不能利用到索引,只能全表扫描
为什么索引无法存储null 值
索引是有序的,null值进入索引时,无法确定其应该放在哪了。(将索引列值进行建树,其中必然涉及到诸多的比较操作,null 值是不确定值无法比较,无法确定null出现在索引树的叶子节点位置)。
5.尽量避免在where 子句中使用!= 或<> 操作符,否则将引擎放弃使用索引而进行全表扫描
6.in 和 not in 也要慎用,否则会导致全表扫描,
select id from t where num in (1,2,3);
对于连续的数值,能用between 就不要用in了
select id from t where num between 1 and 3;
7.应尽量避免在where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
如:select id from t where substr(name,1,3)=’abc’;
8.尽量避免在where子句中对字段进行表达式操作
select id from t where num/2=100;
改为
select id from t where num=100*2;
9.隐式转换的情况
num为varhcar类型
select id from t where num=’2’; //使用索引 (自己试不能用)
Select id from t where num=2;// 索引失效
num 为int 类型
select id from t where num=’2’; //使用索引
select id from t where num=2;//使用索引

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值