sql优化
- 把数据量大的表作为驱动表 (straight join)
- 用exists代替in的子查询
- 在查询多的表上建立索引(一般结果在20%左右)
1.在经常使用where条件的字段上建立索引
2.在表关联的字段上建立索引
3.在经常使用order by 或 group by的字段建立索引
4.根据情况优先使用唯一索引, 单个索引区分度不大时使用联合索引
-
索引失效的情况
1.右模糊匹配时
2.联合索引使用了只使用了右边的索引
3.索引字段是int使用str查询时
4.索引参与运算或使用函数
5.数据量特别少只有几条(全表查询更快时)
事务和隔离级别
事务的四个特性:原子性、 隔离性、 持久性、 一致性
事务出现的问题
- 脏写:事务A改了行数据,事务B也改了该行数据,事务A回滚,事务B提交,事务B的数据也被回滚。
- 脏读:事务A改了行数据,事务B读了事务A修改后的数据,事务A回滚,事务B又读到不同数据。
- 不可重复读:事务A读行数据,事务B修改了该行数据提交事务,事务A再次读到事务B修改后的数。
- 幻读:事务A读行数据,事务B增加了行数据提交事务,事务A再次读到事务B修改后的多条数据。
SQL标准的四种隔离级别
- read uncommitted:只支持快照读(snapshot read)。
- read committed:解决了脏读,使用mvcc实现。
- rea