3306、1521
①Mysql5.5之前默认的存储引擎是MyISAM,在5.5之后,默认的存储引擎是InnoDB。
②MyISAM支持表级锁,不支持事务、行级锁、外键,InnoDB支持事务、表级、行级锁、外键。
③MyISAM崩溃后无法恢复,而InnoDB可以。
④MyISAM不支持MVCC,而InnoDB支持。
“脏数据”,依据“脏数据”所做的操作可能是不正确的。
幻读的重点在于新增或者删除,比如多次进行条件查询发现记录增多或减少了。
READ-UNCOMMITTED读未提交:允许读取尚未提交的数据,可能导致脏读、幻读、不可重复读。
READ-COMMITTED读已提交:允许读取已经提交的数据,未提交的事务不允许读取,可以防止脏读,但是幻读和不可重复读仍有可能发生。
REPEATABLE-READ可重复读:对同一记录的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以防止脏读、不可重复读,但是幻读仍有可能出现。
SERIALIZABLE串行化:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,防止脏读、幻读、不可重复读。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
REPEARTABLE-READ可重复读,可以避免脏读和不可重复读,而InnoDB引擎中不存幻读的情况,所以使用REPEATABLE-READ隔离级别即可实现事务的隔离性要求。
MyISAM使用表级锁。InnoDB支持行级锁和表级锁,默认使用行级锁。
页级锁:MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。页级进行了折衷,一次锁定相邻的一组记录。
| 加锁速度 | 是否出现死锁 | 锁冲突概率 | 并发度 |
表级锁 | 快 | 不会 | 高 | 低 |
行级锁 | 慢 | 会 | 低 | 高 |
页级锁 | 中 | 会 | 中 | 中 |
①使用表级锁替代行级锁。
②当一个线程发现需要申请的资源被加锁了之后,就释放自身拥有的资源。
③多个线程尽量约定以相同的顺序访问资源。(哲学家就餐问题的一种解决思路)。
④同一个事务尽可能做到一次锁定所需要的所有资源。
①限定数据的查询范围。务必禁止不带任何限制数据范围条件的查询语句。比如:当用户在查询订单历史的时候,我们可以控制在一个月的范围内;
②读写分离(主从模式)。经典的数据库拆分方案,主库负责写,从库负责读;
③垂直分区。垂直分区是指数据表列的拆分,把一张列比较多的表拆分为多张表。
④水平分区(集群cluster)。保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。
①数据库自增id:两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。这种方式生成的id有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。
②利用redis生成id:性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。
③利用UUID唯一标识码。
①对查询进行优化,要尽量避免全表扫描,考虑在where及order by涉及的列上建立索引。
②应尽量避免在where子句中使用!=操作符、null值判断,否则引擎将放弃使用索引而进行全表扫描。
③应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
④应尽量避免在where子句中对字段进行聚合函数操作,这将导致引擎放弃使用索引而进行全表扫描。
⑤查询表记录时,使用count(1)来替代count(*)。
⑥任何地方都不要使用select * from t,用具体的字段列表代替“*”,并且不要返回用不到的任何字段。
①查询涉及的磁盘IO次数少(内节点不包含数据,内节点出度大,树的高度小)
②查询效率稳定(每次查询路径长度相同,只有叶节点存储数据,并且叶节点在同一层上)
③遍历和区间查询效率高(从符合条件的某个叶子节点开始遍历即可)
①B+Tree是BTree的改进版,使得所有内节点只用做索引,而数据都存储在叶节点上,使得内节点可以存储更多的索引,因为内节点有更多的出度,使得树的高度降低,提高了查询的效率。
②B+Tree的遍历/区间查询操作比BTree方便,BTree遍历数据时需要遍历整棵树,而B+Tree只需遍历叶子节点即可,因为叶子节点之间形成了一个单链表。
PS:红黑树是自平衡二叉搜索树、BTree是多路搜索树、B+Tree是BTree的改进版,也是多路搜索树。