zoukankan      html  css  js  c++  java
  • 指定id insert,自增属性和不带自增属性效率相差大吗?

          目前生产环境的分库分表的表,含有primary key(id)的,都是由tddl分配的,而不是mysql自带的auto increment,而如果对于已经带了auto increment的,在高并发下,要比不带auto increment的有什么性能上的劣势吗?

          从理论上来讲,mysql在为auto increment维护了一个表锁,即使insert的时候指定了id,也还是会触发mysql维护表锁,到底性能相差多大呢?我在mysql5.1.48上面做了一个小测试:

    innodb_autoinc_lock_mode = 1,关于innodb_autoinc_lock_mode的分配策略,参看丁奇博客普通场景下的分配策略

     1. 准备数据

    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=5000000 --mysql-user=root --mysql-socket=/var/tmp/mysql.sock prepare

    mysqldump -h localhost -u root -B sbtest --tables sbtest --default-character-set=gbk --no-create-db --no-create-info> sbtest_5000000.sql

    2.分别在

    CREATE TABLE `sbtest` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `k` int(10) unsigned NOT NULL DEFAULT '0',
      `c` char(120) NOT NULL DEFAULT '',
      `pad` char(60) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `k` (`k`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5000001 DEFAULT CHARSET=gbk;
    和
    CREATE TABLE `sbtest` (
      `id` int(10) unsigned NOT NULL,
      `k` int(10) unsigned NOT NULL DEFAULT '0',
      `c` char(120) NOT NULL DEFAULT '',
      `pad` char(60) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `k` (`k`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5000001 DEFAULT CHARSET=gbk

    两种表结构中source sbtest_5000000.sql,测试了多遍,带AUTO_INCREMENT的平均时间在3min10s=190s,而不带AUTO_INCREMENT平均时间在2min50s=170s,不带AUTO_INCREMENT的优势(190s-170s)/190s~10.53%。

    而我测的表结构非常简单,生产环境中的表结构要比这个负责的多,高并发下肯定提高的效率不止10%

  • 相关阅读:
    你们要的Intellij IDEA 插件开发秘籍,来了!
    【JDK 11】关于 Java 模块系统,看这一篇就够了
    《水浒传》中的物价
    读书廿一日计划
    诗词记录
    PLSQL14不识别Oracle数据库以及tnsnames.ora中配置的连接串(连接远程Oracle,本地仅安装客户端)
    框架安全之Shiro渗透
    .NET 3.5 安装
    中间件安全之Nginx渗透
    中间件安全之JBoss渗透
  • 原文地址:https://www.cnblogs.com/sunss/p/3036854.html
Copyright © 2011-2022 走看看