推荐学习

  • 阿里P8MySQL,基础/索引/锁/日志/调优都不误,一锅深扒端给你
  • 抖音后端123面开挂,全靠这份啃了58天的「Java进阶核心知识集」
  • 肝了30天,整出这份[分布式宝典:限流+缓存+通讯],秋招跳槽有望

1、插入测试

在此次测试中数据库表有三个字段,id(自增主键)、username、password。

1.1 插入耗时实测

实测:

  • 插入30多万条数据,采用一次事务提交一条sql语句,耗时2小时以上,具体没统计,因为计划是这样插入2000万条数据的,但由于太慢提前终止了,所以插入30多万条数据。
  • 插入2000万条数据,采用一次事务提交10万条sql语句,耗时50多分钟,将近1小时(若是老铁们做这样的实验,可以加上一个时间对象,这样可以看的更加清晰)。

1.2 TestDemo

1.3 测试代码:

1.3.1 MybatisTest

import mapper.TestMapper;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import po.TestBean;import java.io.IOException;import java.io.InputStream;public class MybatisTest {    public static void main(String[] args) throws IOException {        //1.读取配置文件        InputStream in = Resources.getResourceAsStream("mybatis.xml");        //2.创建SqlSessionFactory工厂        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();        SqlSessionFactory factory = builder.build(in);        //3.使用工厂生产SqlSession对象        SqlSession session = factory.openSession();        //4.使用SqlSession创建Dao接口的代理对象        TestMapper testMapper = session.getMapper(TestMapper.class);        //5.使用代理对象执行方法        TestBean testBean =new TestBean();        for (int i = 10; i<20000000 ;i++){            testBean.setName("lbw"+i);            testBean.setPassword("nb"+i);                testMapper.saveTest(testBean);//            //1次操作 提交1次事务//            session.commit();            // 100000次操作提交1次事务            if (i%100000 == 0){                session.commit();            }        }        //6.释放资源        session.close();        in.close();    }}

1.3.2 TestBean

package po;import java.io.Serializable;public class TestBean implements Serializable {    String id;    String name;    String password;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    @Override    public String toString() {        return "po.TestBean{" +                "id='" + id + ''' +                ", name='" + name + ''' +                ", password='" + password + ''' +                '}';    }}

1.3.3 TestMapper

package mapper;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import po.TestBean;public interface TestMapper {    @Insert("insert into test200411(name,password) values(#{name},#{password})")    void saveTest(TestBean t);    @Select("select id,name,password from test200411 where id = #{s}")    TestBean selectById(String s);}

1.3.4 mybatis.xml(mybatis配置文件)

<?xml version="1.0" encoding="UTF-8"?>

1.4 过程体验

程序运行后在几个小时时间里,电脑处于烤机(烤鸡诱惑,烤鸡pg是块宝)状态!!!很遗憾的是,当时没有截图程序运行了的时间,不过1.1结论是数据是保真的,实在不想再搞几千万条数据在数据库了。

1.5 数据量

1.5.1 计数用时

使用 select count(0) from test200411 进行计数,统计查询用时:13.7s,得到统计数: 20379620,之所以是20379620,是因为我测试中先插入30多万,之后再插入2000万。数据是不会骗人的哦,没毛病吧,铁子们。

1.5.2 占用硬盘空间

  • 硬盘空间占用为:1.47GB(1585455597 B)。
  • 分析一下,我的表字段只有3个,且每个字段里面实质存储的数据长度都不长。151585455597 B / 20379620 = 77 B
    这样算下每一行数据平均占用77B,这个数据一看就知道,存储过程中应该是有数据压缩的,这一结论不太严谨,有大佬知道mysql底层存储的话,望指导一下。

2、索引查询测试

2.1 索引检测

使用 show index from test200411可以查到当前表拥有的索引,当前只有我自己自增id的默认索引,和我自己建立的id字段索引。

2.2 对有无索引的字段where查询比较

2.2.1 无索引字段

使用 SELECT * from test200411 where password = "nb1234"查询到两条数据,耗时:57.9s,明显这个查询时间是不可取的

  • 小结论:所以在大表查询我们为什么需要及其注重性能了,平常若是做个小的测试系统,数据量撑死几千,查询时,根本就感觉不出时间上的差异。这也是为什么我们需要那么多数据库优化的策略,索引、分库分表、主从复制、读写分离、缓存设计等等。
  • 为什么会这么慢呢,因为该字段没有索引的话,它就需要一行一行的去做比对,这样做,不仅比对长,磁盘io也多。

2.2.1 有索引字段

使用:SELECT * from test200411 where id = 2566345查询到唯一数据,耗时:0.133s

  • 这个根据索引查询数据的时间和无索引字段查询时间比较,由实质数据得到它们之间性能差了500多倍。
  • 为什么索引这么快?因为索引底层是b+树,所以索引是按照一定的大小顺序来排序的,根据索引查询,能减少磁盘io,也能减少比对次数。

2.3 建立索引

2.3.1 索引创建

使用:CREATE INDEX paw_index ON test200411(password)耗时:156.0s

2.3.2 索引查询

再次查看已经索引,可以看到一个paw_index 的新索引,这就是我们刚刚创建的索引。

2.3.3 查询新建立索引字段

使用 SELECT * from test200411 where password = "nb12345"耗时:0.110s可以将此条sql和 2.2.1 比较 ,除了匹配的字符串不一样(之所以用了不同的字符串,是因为实验是连着做的,同一条字符串查询,会有缓存,影响结果),其他都是一样的。可以看到它们之前惊人的查询速度差异,速度相差大概是500倍。

3、总结

3.1 事务对数据库性能影响

在一个事务内只提交一条sql和在一个事务内提交多个sql,对数据库数据的批量处理影响是很大的。一个事务内提交多个sql可以提高批量数据的处理速度。

3.2 数据库索引对数据库查询性能分析

通过上面的实例,我们可以看到,有无索引对数据库查询速度的影响是很大的,实验中它们速度差异可以到500倍,当然这是取决的实验过程中的数据量,而我们的实验数据量有2000多万行,也正是这样才能放大对 有无索引对数据库查询的影响 效果。

总之,通过这个实例不会有人还没搞懂索引这个东西的重要性和其作用吧!不会吧?不会吧?当然我这没将索引的三板斧,“是什么,为什么需要,怎么做”,全列出来,我觉得写也的还行,带有实例出发,通俗易懂吧!!

这个实验从上到下都是可以复现的,代码和过程都有,有兴趣的小伙伴可以尝试复现一下,让自己对索引的理解加深。

作者: 小小卡尔

原文链接:https://blog.csdn.net/weixin_44185736/article/details/105454820

redis value多大会影响性能_事务对MySQL性能有什么影响?有无索引查找对其影响有多大?...相关推荐

  1. sysbench性能压测以及mysql性能压测

    sysbench性能压测以及mysql性能压测 一.Sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于各种不同系统的参数下的数据库负载情况. 主要测试方式 cpu性能 磁盘io性能 ...

  2. 如何监控和优化mysql查询性能_如何监视MySQL的性能

    这里列出了一些如何监视你安装的mysql性能的一些ideas.监视总是一个持续的过程.你需要知道哪种模式对你的数据库是好的,什么是问题的表象,甚至是危险的情况. 一下列出了用来去监视你的系统的主要参数 ...

  3. mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0

    点小蓝字加关注! 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库 ...

  4. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化

    数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...

  5. mysql左连接_面试考MySQL性能优化,一个问题就干趴下了!

    MySQL作为最流行的关系型数据库管理系统,重要性不言而喻.面试时它也是重点考察对象之一,估计大家都有过被MySQL相关问题支配的经历: 如何理解MySQL中加锁原理以及最终死锁形成的原因 ? 介绍一 ...

  6. 性能监控—spotlight监控mysql性能

    spotlight可以监控mysql性能,同监控linux一样配置 目录 1.安装spotlight 2.参数认识 1.安装spotlight spotlight不仅仅只是监控mysql,还可以完成数 ...

  7. 扩有mysql的磁盘_为提高MySQL性能而在磁盘IO方面的设置

    提起MySQL数据库在硬件方面的优化无非是CPU.内存和IO.下面我们着重梳理一下关于磁盘I/O方面的优化. 1.磁盘冗余阵列RAID RAID(Redundant Array of Inexpens ...

  8. 多核对mysql好处_多核和MySQL性能

    谈到MySQL,存储引擎之间没有比较,只是它分为两个基本类别: 至于列出的存储引擎,唯一具有ACID兼容性的是InnoDB和NDB.为什么要提到这个导入?两个原因: >除了基本磁盘I / O,C ...

  9. mysql事务与jdbc事务_事务(mysql事务、jdbc事务)

    一.MYSQL事务 1.事务 概念:事务是一个用户定义的数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.事务可以是一条sql语句,一组sqi语句或者整个程序. 特性(ACDI): ...

最新文章

  1. C++格式化输入输出
  2. android Fragments详解五:与activity通讯
  3. jmeter获取时间_time 函数
  4. 1_发表论文1_题目:(20181127)
  5. 一些实用的DBA语句之二(慢慢更新)
  6. Substitute Algorithm(替换算法)
  7. Hulu诚意出品 |《百面深度学习》重磅上市
  8. python 命令行解析函数_python命令行解析之parse_known_args()函数和parse_args()使用区别介绍...
  9. 12123两小时没付款怎么办_交管12123支付宝小程序付款不了怎么办 交管12123支付宝缴费方法介绍[多图]...
  10. 租房新体验:AI机器人中介带你看房
  11. Bash:把粘贴板上的内容拷贝的文件中。
  12. 跨域请求解决方法(JSONP, CORS)
  13. java 注释器_注释和注释处理器入门指南
  14. 模电摸索日记之《晶体管放大电路》
  15. python儿童编程入门-如何让孩子轻松学习Python编程
  16. TMS320F2837x + Spartan6/国产FPGA低成本高实时注塑机运动控制器软硬件设计方案
  17. 第十二章:email-mailbox:管理email归档-imaplib:IMAP4客户库-邮箱状态
  18. PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片
  19. eclipse luna java 版本_eclipse luna使用jdk1.8初始化
  20. 博客大巴,自动登录,并发布信息开发小计。

热门文章

  1. python金字塔图绘制_如何用R或Python绘制3d(4变量)三元(金字塔)图?
  2. form提交后台注解拿不到数据_Form表单详解
  3. 2022.2.18自制玉米凉粉
  4. 【NOIP2013模拟】守卫者的挑战(期望概率)
  5. xp改mac地址linux,局域网络必备-mac地址修改
  6. python中enumerate()函数_Python enumerate() 函数
  7. 2018华工计算机考研分数,2018年华南理工大学考研复试分数线
  8. 8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod
  9. mysql导入向导,SQL Server--导入和导出向导
  10. Codeforces 1159A A pile of stones