1.事务:事务指的是满足 ACID 特性的一组操作(insert,update,delete)
这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位
2.ACID:
原子性:事务的所有操作要么全部提交成功,要么全部失败回滚。回滚使用回滚日志实现
一致性:数据库在事务执行前后都保持一致性状态
隔离性:一个事务所做的修改在最终提交以前,对其它事务是不可见的
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
3.并发不一致:丢失修改,读脏数据,不可重复读,幻影读
4.可以通过封锁实现并发不一致问题:读写锁(互斥锁X,共享锁S),意向锁
5.事务隔离级别:
未提交读(READ UNCOMMITTED):事务中的修改,即使没有提交,对其它事务也是可见的。
提交读(READ COMMITTED):一个事务只能读取已经提交的事务所做的修改。(Mysql默认级别)
可重复读(REPEATABLE READ):保证在同一个事务中多次读取同一数据的结果是一样的。(oracle默认级别)
可串行化(SERIALIZABLE):强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题,需要加锁实现
5.SQL优化:对查询进行优化,应尽量避免全表扫描,首先应该考虑在where和order by涉及列上建立索引
6.innoDB引擎:支持事务,支持外键,innoDB是聚集索引,innoDB不保存表的具体行数,innoDB不支持全文索引。
7.索引
普通索引:
CREATE INDEX [index name] ON [table name] (column(length))
ALTER TABLE [table name] ADD INDEX [index name] (column(length))
唯一索引:索引列必须唯一,但允许有空值(主键索引则不允许有空)
CREATE UNIQUE INDEX [index name] ON [table name] (column(length))
全文索引:仅可用于MySIAM表
CREATE FULLTEST INDEX [index name] ON [table name] (column)
组合索引:最左前缀(当查询语句要包含最左的column1时才走索引)
CREATE INDEX [index name] ON [table name] (column1,column2)
查看索引:SHOW INDEX FROM [table name]
删除索引:DROP INDEX [index name] ON [table name]
8.索引的优化
索引不会包含有NULL值的列,所以再创建表时给字段默认值
使用短索引,即指定column(length)
不要在列上进行运算,会在每个行上进行运算,导致全表扫描
Mysql只对以下操作符使用索引:<>=,between,in,(不以通配符%开头的)like