索引
什么是索引
索引就是用来优化查询,加快查询速度。
为什么需要索引
索引是优化查询的最有效手段
索引的优劣
优势:优化查询加快检索速度;根据索引分组和排序可以加快分组和排序;
劣势:索引本身也是表,在一定程度上会占用存储空间;
创建索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX myindex (username(16))
);
关键字:index 索引;myindex 索引名字;(username(16)) 索引要加在的列
创建索引2
create index myindex on mytable(username(16));
查看索引
SHOW INDEX FROM mytable;
删除索引
DROP INDEX myindex ON mytable;
案例练习
-- 创建索引语法
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX myindex (username(16))
);
-- index 索引 myindex 索引名字 (username(16))字段名字和长度
-- 查看索引
show index FROM mytable;
-- 删除索引
drop index myindex on mytable;
-- 添加索引2
create index myindex on mytable(username(16));
索引的使用规则
索引的分类
1、主键索引:根据主键建立索引,不允许重复,不允许空值;
2、唯一索引:建立索引的那一列的值必须是唯一的,允许空值;
3、普通索引:加在普通列上的索引,没有任何限制;
适合加索引
1、主键自动建立唯一索引;
2、经常出现在where和order by后的要加索引
3、作为排序的列适合加索引
不适合加索引
1、经常增删改的列不要加
2、大量重复的列不要加
3、数据太少的不要加
事务
什么是事务
事务是一个不可再分的工作单位,事务保障了数据的一致性要么都成功要么都失败。
事务的使用
开启事务
start transaction;
提交事务
commit;
发生异常,回滚事务
rollback;
案例
-- 事务
create table t_act(
actno int PRIMARY key,
balance int
);
-- 提交事务
start TRANSACTION;-- 开启事务
insert into t_act value(3,900);-- 添加数据
commit;-- 提交事务
select * from t_act;
-- 回滚事务
start TRANSACTION;-- 开启事务
update t_act set balance=balance-100 where actno=3;-- 修改数据
ROLLBACK;-- 回滚事务
事务的特征
原子性:事务是最小的单位,不可再分;
一致性:事务要求所有的DML语句操作的时候必须保证同时成功或者同事失败;
隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰;
持久性:是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)。
事务的隔离级别
读未提交:事务A和事务B,A读到了B没有提交的数据
读已提交:a和b a提交了b才能读取到 默认级别
不可重复读:前后读取不一致
可重复读:幻读 插入了一条数据 读出来符合条件的的数据前后多
可串行化:串串一样排队
总结
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大
锁
什么是锁
锁是计算机协调多个进程或线程并发访问某一资源的机制
乐观锁
自己去实现的,认为这次操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,
再去判断是否有冲突了
悲观锁
悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次 操作时都要通过获取锁才能进行对相同数据的操作
共享锁
也称为读锁,允许事务读取一行数据
排它锁
也称写锁,允许事务删除或更新一行数据
锁的粒度
锁的粒度就是你要锁定的范围是多大。使用锁时,锁定的东西越少,对其他竞争者影响越小,这个东西的大 小就是锁粒度
表级锁
开销小,加锁快,不会出现死锁。锁定粒度最大,适合查询为主的,只有少量按索引条件更新 数据的操作。缺点是资源争用概率高
行级锁
开销大,加锁慢,会出现死锁。锁定粒度最小,适合大量按索引条件并发更新少量不同数据, 同时又有并发查询的操作。
页面锁
开销介于表锁与行锁之间,会出现死锁
注意事项
共享锁之间是兼容的,而排它锁与其他任意锁都不兼容。因此我们在数据库中可以并行读,但只 能串行写,只有这样才不会发生线程竞争