1.索引
索引的作用类似书籍目录,可以用于快速定位,检索数据
可以对数据库表的某列或者某几列创建索引
索引针对查询操作引入的优化手段,但生成索引也会占用更多的空间
对于插入/删除/修改频率高的表不适用索引
使用场景
数据量大,经常对这些列进行条件查询
2.查看/创建/删除索引
创建主键约束,唯一约束,外键约束时,会自动创建对应列的索引
查看索引
show index from 表名;
创建索引
create index 索引名 on 表名(字段名);
删除索引
drop index 索引名 on 表名;
2.事务
问题:转账 如果执行一半程序崩溃/数据库崩溃...
开发中经常会涉及到一些需要'一气呵成'完成一些操作的场景
事务可以把多个sql打包成一个整体,确保这些sql语句要么全部执行,要么"一个不执行"(翻新回滚).引入事务可以避免上述问题
使用
1)开启事务:start transaction;
2)执行多条sql语句
3)回滚或提交 rollback/commit rollback(全部失败) commit(全部成功)
回滚依据日志记录事物的关键操作实现
start transaction;update accout set money=money-2000 where name = '阿里巴巴';update accout set money=money+2000 where name = '四十大盗';commit;
事务特性
1)原子性 回滚的方式 保证这一组操作都能执行正确或者全部执行失败恢复如初
2)一致性:事务执行之前和执行之后要合理
3)持久性:事务做出的修改在硬盘上持久保存,重启服务器,事务执行的修改仍然有效
4)隔离性:数据库并发执行多个事务会出先一些问题,并发(一个服务器给多个客户端提供服务)
数据库服务器执行效率高就要提高并发程度,但可能会导致数据出现错误的情况
a.脏读问题
一个事务A在写数据的过程中.事务B读取了同一个数据,接下来事务A修改了数据,导致事务B之前读到的数据是一个无效的数据(脏数据)
解决:针对写操作加锁,事务A确认写完后事务B在读(并发性降低了,隔离性提高,效率降低,数据准确性提高)
b.不可重复读
并发执行事务过程中,事务A在内部多次读取同一个数据的时候,出现不同的情况,例(上述问题中,事务B读取数据的时候,事务A(加了写数据锁)修改数据又再次提交,事务A在事务B读的时候写),一个事务内部两次读,结果不一样,
解决:给读操作加锁,(约定事务B读的时候,事务A不能修改)(并发性进一步降低了,隔离性进一步提高,效率进一步降低,数据准确性进一步提高)
c.幻读
事务B执行两次读取操作,数据内容没改变,但是结果集变了(事务B读取m文件时,事务A不能修改m文件,但是事务A在写n文件,事务B结果发现n文件)
解决:保持绝对的串行执行事务,完全没有并发,事务B在读的时候,事务A什么也不干,隔离性最高,数据最准确
可以在mysql配置文件中,修改数据库的隔离级别,适应不同场景的需求
read uncommitted(读未提交) 并发程度最高
read committed(读已提交) 引入写加锁
repeatable read(可重复读) 引入写加锁和读加锁
serializable(串行化)