`

InnoDB和MyISAM对比,以及InnoDB行锁使用(生成唯一id)

阅读更多

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> 

 

 

  • 大小: 35.8 KB
分享到:
评论

相关推荐

    MyISAM引擎与InnoDB引擎性能的对比

    然而,由于这些额外的功能,InnoDB在内存使用和磁盘I/O上可能比MyISAM更消耗资源。 在性能对比上,MyISAM通常在读取速度上有优势,因为它不需要管理事务和行级锁定。但在写入密集型应用中,InnoDB的行级锁定能提供...

    mysql数据据存储引擎InnoDB和MyISAM的优势及区别分享.pdf

    3. 锁定机制:InnoDB 使用行锁(locking on row level),而 MyISAM 使用表锁(table lock)。 4. 性能:InnoDB 的性能比 MyISAM 高,特别是在高并发场景下。 5. 数据存储:InnoDB 将数据和索引存放在表空间里,可能...

    MyISAM和InnoDB的异同

    MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们各自拥有不同的特点和适用场景。 #### MyISAM引擎概述 MyISAM是MySQL早期默认使用的存储引擎,它主要适用于读取密集型的应用场景。MyISAM支持表级锁定,这意味...

    mysql更改引擎(InnoDB,MyISAM)的方法

    mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。 查看当前数据库的所支持的数据库引擎以及默认数据库引擎 数据库支持的引擎和默认数据库引擎代码: 代码如下:show engines; ...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM和InnoDB存储引擎的区别。 FULLTEXT索引 MyISAM支持FULLTEXT索引,而InnoDB不支持。FULLTEXT索引可以对文本字段进行索引,以提高...

    MySQL存储引擎之争-InnoDB与MyISAM全面对决

    本文主要讨论的是InnoDB和MyISAM这两个引擎的对决,两者在事务处理、数据恢复、并发控制、存储空间占用以及读取性能等方面都有显著差异。 首先,InnoDB存储引擎支持事务处理,这使得它适用于那些需要确保数据完整性...

    MyISAM InnoDB 区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...

    MyISAM与InnoDB的索引差异

    MySQL中的存储引擎MyISAM和InnoDB在处理索引上有显著的差异,这些差异主要体现在索引的组织方式以及对数据存储的影响上。两者都基于B+树这种高效的索引结构,但具体实现有所不同。 首先,MyISAM的索引采用非聚集...

    Innodb与Myisam引擎的区别与应用场景

    其中,InnoDB和MyISAM是最为常见的两种存储引擎,它们各自具备独特的特性和适用场景。下面将详细探讨这两种引擎的主要区别及其在不同场景下的应用。 #### 一、InnoDB与MyISAM的关键区别 1. **事务处理** - **...

    《MYSQL备份与恢复》之 Innodb与 MyISAM引擎

    (2)innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,innobackupex是一个perl脚本封装,封装了xtrabackup,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁。并且加入了一些...

    mysql 中InnoDB和MyISAM的区别分析小结

    总的来说,InnoDB更适合需要事务处理、数据完整性以及高并发读写的应用,而MyISAM则适用于读取密集型、对全文搜索有需求或者对启动速度和内存使用敏感的场景。选择哪种存储引擎应根据具体业务需求进行权衡。在实际...

    myisam与innodb 区别 值得下载

    自己总结的 关于mysql存储引擎myisam innodb 的比较 两者区别 对面试会很有帮助

    数据库引擎 MyISAM 和 InnoDB 对比

    ### 数据库引擎 MyISAM 和 InnoDB 的对比分析 在MySQL数据库系统中,MyISAM与InnoDB是最常被提及的两种存储引擎。这两种引擎在功能、性能以及适用场景上存在显著差异,本文将深入探讨这两者之间的区别,并分析它们...

    mysql DB引擎myisam与innodB

    在 MySQL 数据库系统中,存在多种不同的存储引擎,其中最为人所熟知且广泛使用的两种是 MyISAM 和 InnoDB。这两种存储引擎各自具有独特的特点和适用场景。 #### InnoDB:事务安全与外键支持 InnoDB 是 MySQL 中...

    myisam innodb对比1

    ### MyISAM与InnoDB对比分析 #### 一、数据存储区别 - **堆表**:数据无序存储,适用于不频繁更新的情况。 - **索引组织表**:表的数据和索引紧密关联,通常主键就是数据的物理排列顺序。 **MyISAM**: - 属于堆...

    mysql存储引擎-innodb与myisam的区别.doc

    mysql存储引擎-innodb与myisam的区别.doc

    MySQL存储引擎中MyISAM和InnoDB区别详解

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...

Global site tag (gtag.js) - Google Analytics