随笔分类 - mysql
摘要:IOC的核心理念即是控制反转。将对依赖的控制从具体业务对象手中转交到平台或框架中,需要的时候再由平台或框架注入到具体业务对象中。可以说依赖注入是控制反转的实现方式。 IOC的优点: 降低代码耦合度 减少重复代码和冗余对象 提升可测试性 IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。 在Spring IoC容器的设计中,有两个主要的容器系列,一个是实现了Bean...
阅读全文
摘要:缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 解决办法: 预校验 在控制层对查询参数先进行校验,不符合则丢弃。 布隆过滤 将所有可能查询的参数添加到BloomFilter中,一定不存在的记录就会被BloomFilter过滤掉,从而避免了对底层存储系统的查询压力。 缓存空...
阅读全文
摘要:CAP原则 CAP原则又称CAP定理,是一个经典的分布式系统理论。CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。 一致性 在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一...
阅读全文
摘要:logs innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位...
阅读全文
摘要:InnoDB是一个支持行锁的存储引擎,它有三种行锁的算法: Record Lock:行锁,单个行记录上的锁。 Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止幻读、防止间隙内有新数据插入、防止已存在的数据更新为间隙内的数据。 Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。InnoDB...
阅读全文
摘要:ANSI/ISO SQL定义的标准隔离级别有四种,从高到底依次为:可序列化(Serializable)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。 下面将依次介绍这四种事务隔离级别的概念、用法以及解决了哪些问题(读现象) 未提交读(Read uncommitted) 未提交读(READ UNCOMMITTED...
阅读全文
摘要:为什么需要隔离 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题: 脏读 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到...
阅读全文
摘要:数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性...
阅读全文
摘要:死锁产生 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。 当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能会产生死锁。 锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁有些不会——死锁有双重原因:真正的数据冲突;存储引擎的实现方式。 检测死锁 数据库系统实现了各种死锁检测和死锁超时的机制。Inn...
阅读全文
摘要:锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking) BDB 存储引擎采用的是页面锁(page-le...
阅读全文
摘要:乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。 通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获...
阅读全文
摘要:索引选择性 索引选择性是索引基数(cardinality)与表中数据行数(n_row_in_table)的比值,即 索引选择性=索引基数/数据行 其中cardinality是索引中不重复记录的预估值。 不是所有的查询条件出现的列都需要添加索引。对于什么时候添加B+树索引。一般的经验是,在访问表中很少一部分时使用B+树索引才有意义。对于性别字段、地区字段、类型字段,他们可取值范围很小,称为低选择性...
阅读全文
摘要:执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看。如下所示: explain select * from table where table.id = 1 运行上面的sql语句后你会看到,下面的表头信息: table | type | possible_keys | key | key_len | re...
阅读全文
摘要:通过实例理解单列索引、多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: SELECT `uid` FROM people WHERE lname`='Liu' AND `fname`='Zhiqun' AND `age`=26 因为我们不想扫描整表,故考虑用索引。 单列索引: ALTER TABLE people ADD INDEX lname (lname);将ln...
阅读全文
摘要:WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引 类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引 在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用 如果WHERE子句的查询条件里使用了比较操作...
阅读全文
摘要:mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引. 单列索引:一个索引只包含一个列,一个表可以有多个单列索引. 组合索引:一个组合索引包含两个或两个以上的列, 本文案例使用的表: CREATE TABLE `award` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `aty_id` varchar...
阅读全文
摘要:一、定义 索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。本质:索引是数据结构。 二、B-Tree m阶B-Tree满足以下条件: 每个节点至多可以拥有m棵子树。 根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶,也是树)。 非根非叶的节点至少有的Ceil(m/2)个子树(Ceil表示向上取整,如5阶B树,每个节点至少有3个子树,也...
阅读全文
摘要:主索引 将主文件分块,每一块对应一个索引项。每个存储快的第一条记录,又称为锚记录。 主索引是按照索引字段值进行排序的一个有序文件,通常建立在有序文件的基于主码的排序字段上。 主索引是稀疏索引。 辅助索引 定义:定义在主文件的任意一个或者多个非排序字段上的辅助存储结构。 辅助索引通常对字段(该字段非排序)的每一个不同值有一个索引项。 字段值不唯一,引入中间桶保存指针列表。 辅助索引是稠密索引。 二...
阅读全文
摘要:聚集索引 索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的),可以这么理解:只要是索引是连续的,那么数据在存储介质上的存储位置也是连续的。 聚集索引就像我们根据拼音的顺序查字典一样,可以大大的提高效率。在经常搜索一定范围的值时,通过索引找到第一条数据,根据物理地址连续存储的特点,然后检索相邻的数据,直到到达条件截至项。 InnoDB引擎的数据文件本身就是...
阅读全文