数据库
文章平均质量分 54
圆脸娃
输赢不重要,超神才是王道
展开
-
mysql覆盖索引
mysql查询的时候,为了优化查询效率,一般都要创建索引。最常见的索引就是,聚集索引和辅助索引。 聚集索引既是索引,也存储了实际的数据;辅助索引存储了索引列数据和主键的标签(指向聚集索引中该主键实际存放的位置),如图关系:现在有一个叫做覆盖索引的,是这样子的:一般情况下,查询时,先查辅助索引,再查聚集索引,这样就需要多次IO。而覆盖索引就是将需要查询的数据列建立联合索引原创 2016-08-16 11:49:15 · 663 阅读 · 0 评论 -
jdbc流stream读取超大数据
这几天在做分库分表,涉及到数据迁移,然后设计的方案是使用mybatis将数据分批读取出来,每批大概40--50万条数据,然后将查询来的数据再insert进去,发现这个效率很低,程序有卡顿,而且客户端很容易OOM。找了一下原因就是jdbc默认的读取数据的时候,会将要查询的数据一次性读到内存中,再通过resultSet循环读取出来,这样子40--50万条数据很容易就撑爆内存,然后调研了下发现,其实...原创 2019-04-03 16:44:40 · 6650 阅读 · 3 评论 -
mysql事务隔离级别另类解释
MySQL事务隔离级别老生常谈,老是理解不到位,今天以特定的角度理解一下1.前提:MySQL为了多用户同时操作数据时避免相互干扰所以产生了事物的隔离级别2.有这么几种:read-uncommitted(读未提交) 、read-committed(读已提交)、read-repeated(可重复读)、serializable(串读)我们这么理解:将前三种种拆成两部分,每一部分表示一个事...原创 2018-11-22 20:32:25 · 255 阅读 · 1 评论 -
Innodb事务种类及实现
innodb事务可以分为以下几种:1.扁平事务2.带有保存点的扁平事务3.链事务4.嵌套事务5.分布式事务各自分别介绍:1.扁平事务 这是事务中最简单的一种,也是使用最广泛的一种。在扁平事务中,所有的操作都在同一层次,由begin work开头,由commit work或者rollback work结束,两者之间的操作是原子性的,要么都做,要么都不做。 扁平原创 2016-09-05 10:11:38 · 3244 阅读 · 2 评论 -
InnoDB内部实现一点笔记
1.后台线程InnoDB是多线程模型,后台有不同的线程负责处理不同的任务1.1master thread非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性1.2IO threadInnoDB大量使用了AIO来处理写IO请求,极大地提高了数据库的性能1.3 purge thread事务被提交后,其所使用的undolog可能不再需要了,所以使用pu原创 2016-08-13 10:24:00 · 750 阅读 · 0 评论 -
InnoDB一点零散的知识点
外键不加索引会引起死锁的问题情景主表parent主键id,字表child主键cid,cid为parent外键,和parent中id来源一致当对parent或者child进行删除操作时,如果外键没有索引,数据库就会将行锁升级为表锁,从而可能导致大量的等待和死锁大多数数据库现在致力于解决这个问题,但也只是降低了这种情况下死锁的风险,并没有完全消除解决外键加上索引就可以了,事实表原创 2016-08-12 10:43:48 · 322 阅读 · 0 评论 -
innodb并发控制mvcc(多版本并发控制)
innodb有四种事务隔离机制,read uncommitted、read committed、repeatted read、 serializable,隔离界别依次提高,而且基本靠锁实现这些隔离级别,但众所周知,锁的消耗是很大的。当然,我们也都知道,mysql实现了一种乐观锁的机制,在select 时候加上 for update就可以了,而且我们知道乐观锁其实是不用锁的,是靠数据的版本控制实现的原创 2016-09-02 14:07:30 · 1388 阅读 · 0 评论 -
oracle snapshot too old异常
继oracle外键不加索引会死锁之后,又看到oracle一个有名的异常,snapshot too old,情景是这样的 假设有一个表,有一亿行数据,现在第一个任务在执行select *操作,第二个任务修改了第5000万行的数据,并进行了commit,那么等到第一个任务执行到第5000万行数据时,就会报snapshot too old异常,为什么会这样呢? 其实一般情况下,数据库都会原创 2016-09-01 17:36:26 · 8119 阅读 · 4 评论 -
InnoDB行锁、事务还有死锁
InnoDB行锁有3种实现1.record lock,锁住单行记录2.gap lock,我们熟知的间隙锁,会锁住一个范围,但不包含记录本身3.next -key lock,前两种锁的联合使用,不仅锁定范围,也锁定记录本身。 InnoDB默认的事务隔离级别是repeatable read,在该隔离级别下,采用第三种方式来加锁;事务级别在read committed下,采用第一种加锁方原创 2016-08-21 16:28:38 · 1507 阅读 · 0 评论 -
mysql中的锁
先区分两个锁概念,latch和lock都是锁,但是1.latch,属于轻量级的的锁,要求锁定的时间非常短,若时间变长,性能会变差;在InnoDB中,实现分为mutex(互斥量)和rwlock(读写锁),通常用来保证多线程对临界资源的访问,通常没有死锁的检测机制;InnoDB中的latch在不能获得锁的情况下,会先进行自旋,若自旋也不能获得锁,则进入等待状态。2.lock,锁定的的对象是事务原创 2016-08-20 15:50:38 · 414 阅读 · 0 评论 -
mysql引擎InnoDB索引中的cardinality关键字
执行show index时,有一列叫做cardinality,这一列至关重要,如图那么它是干啥的呢一般我们在mysql中添加索引的时候,首先要选择创建索引的列,但并不是所有查询的列都要创建索引,我们是有一个标准的,就是要选择高选择性的列。当然也会有相对的低选择性列。低选择性列:比如性别,地区这种字段,取值的范围比较小,称为低选择性,如果在这种列上添加索引,是完全没有意义的。原创 2016-08-20 10:41:55 · 803 阅读 · 0 评论 -
mysql中关于索引的一些查询
1.左连接左连接的时候,由于左表的数据都会拿到,所以需要对右表建立索引,从而提高查询效率2.右连接右连接的时候,由于右表数据都会拿到,所以需要对左表建立索引,从而提高查询效率3.内连接内连接和右连接一样,需要左表建立索引,从而提高查询效率4.exists和inexists时先是外表做loop,然后每一次loop后再查询内表;in是对外表和内表做hash连接;具体使用要分原创 2016-08-19 14:09:59 · 441 阅读 · 0 评论 -
倒排索引学习笔记
为什么叫倒排索引呢,我的理解:正常的查找应该是这样的倒排索引是这样的:就是说,正常的查找是在文件中查找某个单词;而倒排索引是根据单词查找某个文件倒序索引有几个概念:1.文档:就是我们通常使用的文档,如word,html网页等2.单词:是将文档中的内容进行拆分,找出来逻辑上构成一个完整表述的字符串3.字典:存储所有单词,每一条记录由单词和指向倒排列表的指针原创 2016-08-18 11:36:06 · 1422 阅读 · 0 评论 -
mysql数据库文件和innodb存储引擎文件学习笔记
数据库文件和存储引擎文件会让我们知道数据库和存储引擎的各种内部状态和工作模式,简单看一下mysql数据库文件1.参数文件 mysql数据可以实例启动的时候,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数。若找不到,不会报错,会使用编译mysql时指定的默认值和源代码中指定的参数默认值,但如果数据库实例找不到mysql架构,就会启动失败,架构中(p原创 2016-08-06 10:57:40 · 749 阅读 · 1 评论 -
数据库连接池设置----可能跟你想的不一样
看到一篇关于数据库连接池设置的文章,讲的很透彻,贴出来,共同学习译文:https://blog.csdn.net/zzzgd_666/article/details/82842839原文:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing...转载 2019-07-02 09:24:11 · 216 阅读 · 0 评论