1、limit M,N如何优化?
这个问题比较常见,可以分为以下几种情况
1.数据量小的情况可以直接使用limit M,N
2.数据量中等的情况可以使用数学中的正态曲线来解决此问题,不过前提要计算出where中的总数量
3.数据量大且有上一页写一页的操作,可以在每一页的数据下发一个自增ID,以便可以在下一页的时候where id>xx limit N;上一页的时候where id<xx limit M desc;此问题有个问题就是数据在翻页过程中可能有书籍漏掉的情况
4.数据量大且有直达页的情况,就需要先计算本页所有的ID(此时用到覆盖索引),然后通过自增ID去获取相关数据
2、Mysql 四种隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读 | 可能 | 可能 | 可能 |
已提交读 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
可串行化 | 不可能 | 不可能 | 不可能 |
1.未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
2.提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
3.可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
4.串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞1.脏读 :一个事务读取到另一事务未提交的更新数据
2.不可重复读 : 在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据.
3.可重复读 : 在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。
4.幻读 :一个事务读到另一个事务已提交的insert数据