先看一下隔离级别, 隔离级别首先要明确 ,隔离的越重,那么自然会失去效率,为什么有这么多的隔离级别,其实就是平衡业务关系尽可能的提高效率。
下面看下隔离级别和介绍:
读未提交是指:一个事务还没提交时,它做的变更就能被别的事务看到。
读提交是指:一个事务提交之后,它做的变更才会被其他事务看到。
可重复读是指:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
串行化:顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。其中“读提交”和“可重复读”比较难理解,所以我用一个例子说明这几种隔离级别。假设数据表 T 中只有一列,其中一行的值为 1,下面是按照时间顺序执行两个事务的行为
假如 mysql 修改(update) age 这个这个字段 ,由age 36 修改为 18
首先1.启动事物 2,修改值 3 commit(提交事物 )整个过程结束。
那么当另外一个事物正好访问age 这个修改的字段是 改怎么处理呢。
读提交 :必须等修改的事物 commit 提交之后才能访问,也就是 在没有修改事物提交之前还是访问的36
读未提交: 表示 我可以等你不提交,就能读到数据,那么这个时候读到的数据就是18 (虽然修改事物没有提交)
可重复读,表示 我这个读事物前后一致,也就是说我读事物在没有提交之前 读到什么数据 就一直是什么数据,(读事物没有commit之前)
串行化: 当一个事物会加锁,执行完之后 另外一个事物才能执行。当 查询事物commit 之后 修改事物才能执行,或者当修改事物commit 之后 查询事物才能执行。
再说一下索引:
mysql 数据库大部分用的是innoDB,见索引要注意回表问题。
先说一下回表, innoDB采用B+树的方式,它分为主键索引(聚簇索引),业务类索引(非聚簇索引),当我们查询一个字段的时候,mysql 会返回主键 然后 再把数据返回,
比如 * where age =18 他会先用age 这个业务索引找到 主键id 然后用主键id 取找出所有查询的数据 这个过程叫回表。
你的 索引设计 如果设计不当很可能会增加 回表的次数 从而影响 查询效率
举例说一下:比如查询 where age =18 and sex =‘男’ 你的索引 age 但是sex 没有,
这样的话 按照最左匹配原则,age 是会走索引的,但是sex 没有索引 ,这样就是增加一次回表,即先通过age 查询id 然后 用id 找出数据 看看sex是否符合。
但是如果你 (age, sex) 这样做联合索引 按照 最左匹配原则 你age 首先说可以使用,那么 你在使用查询语句的where age =18 and sex =‘男’ 时候,减少了一次回表 (这叫索引下推)
拿怎么设计呢,比如你的业务需求中 关于年龄和性别这两个是高频查询次数,那么就直接设计联合索引,这样还能减少单独设计age 这个索引(索引最左原则)