InnoDB:有事务、支持行锁,适用于并发处理的业务。针对单个操作,因为有事务(即使查询也是自动提交一个事务),相对开销大,但支持并发处理不同行数据,所以吞吐量大。
MyISAM:无事务,表锁,适合少量并发操作。针对单个操作,因为无事务,表锁时间开销小,读取速度快。但崩溃不可恢复,所以一般用于不重要的,或只供查询的业务使用。
对于集群分布式服务来说,需要保证某个服务的表的唯一id,假设不再使用mysql的自增id。有很多方式,这里举例一个。为了避免频繁读取可用id,集群中每个服务器每次取一定量的可用的id范围,不够了再取。
方案:主库建新表存储唯一id的信息,目前值、每次取得值范围。
service:
@Service public class AutoNumberImplService implements AutoNumberService { private ConcurrentHashMap<String, AutoNumberItem> type2AutoNumberMap = new ConcurrentHashMap<String, AutoNumberItem>(); @Resource private AutoNumberDao dao; @Override public int getNextNumber(AutoNumberType type) { return getNextNumber(type, false); } public int getNextNumber(AutoNumberType type, boolean needFromDB) { AutoNumberItem item = type2AutoNumberMap.get(type.name); if (needFromDB || item == null) { AutoNumberItem newStep = getNewStep(type); type2AutoNumberMap.putIfAbsent(type.name, newStep); item = newStep; } int next = item.getNext(); int maxNumber = item.getMax(); if (next > maxNumber) { return getNextNumber(type, true); } return next; } @Transactional private AutoNumberItem getNewStep(AutoNumberType type) { AutoNumberItem item = dao.select(type.name); item = new AutoNumberItem(item.getStart(), item.getStep());//事务里查询出来的结果适用空构造函数,所以对象的其他值为默认值 Map<String, Object> params = new HashMap<String, Object>(); params.put("name", type.name); params.put("inc", item.getStep()); dao.update(params); return item; } }
model:
public class AutoNumberItem { private int start; private int step; private int max; private int now; public AutoNumberItem() { } //奇葩的是,mybites查询出来适用默认构造函数 public AutoNumberItem(int start, int step) { this.start = start; this.step = step; this.max = this.start + this.step; this.now = start; } public synchronized int getNext() { now += 1; return now; } public int getMax() { return this.max; } public int getStart() { return start; } public int getStep() { return step; } }
配置文件:
<mapper namespace="com.liu.dao.AutoNumberDao"> <resultMap type="com.liu.model.AutoNumberItem" id="itemMap"> <result column="Start" property="start" /> <result column="Step" property="step" /> </resultMap> <!-- mybsits_config中配置的alias类别名,也可直接配置resultType为类路劲 --> <select id="select" parameterType="String" resultMap="itemMap"> <![CDATA[ select Start,Step from autonumber where name=#{name} FOR UPDATE ]]> </select> <insert id="insert" parameterType="com.liu.model.AutoNumberItem" flushCache="true"> insert into autonumber (Name, Start, Step) values (#{name,jdbcType=VARCHAR}, #{start,jdbcType=INTEGER}, #{step,jdbcType=INTEGER}) </insert> <update id="update"> update autonumber <trim prefix="set" suffixOverrides=","> <if test="inc!=null">start=start+#{inc,jdbcType=INTEGER},</if> </trim> where Name=#{name,jdbcType=VARCHAR} </update> </mapper>
相关推荐
然而,由于这些额外的功能,InnoDB在内存使用和磁盘I/O上可能比MyISAM更消耗资源。 在性能对比上,MyISAM通常在读取速度上有优势,因为它不需要管理事务和行级锁定。但在写入密集型应用中,InnoDB的行级锁定能提供...
3. 锁定机制:InnoDB 使用行锁(locking on row level),而 MyISAM 使用表锁(table lock)。 4. 性能:InnoDB 的性能比 MyISAM 高,特别是在高并发场景下。 5. 数据存储:InnoDB 将数据和索引存放在表空间里,可能...
MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们各自拥有不同的特点和适用场景。 #### MyISAM引擎概述 MyISAM是MySQL早期默认使用的存储引擎,它主要适用于读取密集型的应用场景。MyISAM支持表级锁定,这意味...
mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。 查看当前数据库的所支持的数据库引擎以及默认数据库引擎 数据库支持的引擎和默认数据库引擎代码: 代码如下:show engines; ...
MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM和InnoDB存储引擎的区别。 FULLTEXT索引 MyISAM支持FULLTEXT索引,而InnoDB不支持。FULLTEXT索引可以对文本字段进行索引,以提高...
本文主要讨论的是InnoDB和MyISAM这两个引擎的对决,两者在事务处理、数据恢复、并发控制、存储空间占用以及读取性能等方面都有显著差异。 首先,InnoDB存储引擎支持事务处理,这使得它适用于那些需要确保数据完整性...
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...
MySQL中的存储引擎MyISAM和InnoDB在处理索引上有显著的差异,这些差异主要体现在索引的组织方式以及对数据存储的影响上。两者都基于B+树这种高效的索引结构,但具体实现有所不同。 首先,MyISAM的索引采用非聚集...
其中,InnoDB和MyISAM是最为常见的两种存储引擎,它们各自具备独特的特性和适用场景。下面将详细探讨这两种引擎的主要区别及其在不同场景下的应用。 #### 一、InnoDB与MyISAM的关键区别 1. **事务处理** - **...
(2)innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,innobackupex是一个perl脚本封装,封装了xtrabackup,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁。并且加入了一些...
总的来说,InnoDB更适合需要事务处理、数据完整性以及高并发读写的应用,而MyISAM则适用于读取密集型、对全文搜索有需求或者对启动速度和内存使用敏感的场景。选择哪种存储引擎应根据具体业务需求进行权衡。在实际...
自己总结的 关于mysql存储引擎myisam innodb 的比较 两者区别 对面试会很有帮助
### 数据库引擎 MyISAM 和 InnoDB 的对比分析 在MySQL数据库系统中,MyISAM与InnoDB是最常被提及的两种存储引擎。这两种引擎在功能、性能以及适用场景上存在显著差异,本文将深入探讨这两者之间的区别,并分析它们...
在 MySQL 数据库系统中,存在多种不同的存储引擎,其中最为人所熟知且广泛使用的两种是 MyISAM 和 InnoDB。这两种存储引擎各自具有独特的特点和适用场景。 #### InnoDB:事务安全与外键支持 InnoDB 是 MySQL 中...
### MyISAM与InnoDB对比分析 #### 一、数据存储区别 - **堆表**:数据无序存储,适用于不频繁更新的情况。 - **索引组织表**:表的数据和索引紧密关联,通常主键就是数据的物理排列顺序。 **MyISAM**: - 属于堆...
mysql存储引擎-innodb与myisam的区别.doc
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...