【JAVA】MySQL总结

索引

1.Hash算法【等值查询效率较高,但不能进行范围查找】,无序,无法进行大小的比较,Hash索引只能支持等于查询,无法支持范围查询
2.二叉树,有可能产生不平衡,IO次数多,每个节点只存放一个数据
3.平衡二叉树(AVL树)【效率还可以,同时解决了hash算法不能范围查找的问题】,树高度高,查询效率慢,每个节点只存放一个数据
4.B树【节点增加元素,减少了树的高度,加快IO操作】,范围查询效率还是比较低。
5.B+树【解决范围查询问题、减少IO查询的操作】,降低树的高度,减少磁盘io的次数。
B树的范围查找使用回旋效率较低。
B+树所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,从而范围查询效率非常高。
https://www.jianshu.com/p/4666d72626bd

不建议使用uuid使用数据库主键,不支持范围查询
子查询的性能比较差,建议改造成JOIN写法;

log

binlog的作用是复制和恢复而生的。

undolog用于事务回滚时,只是将数据库逻辑地恢复到原来的样子,保证事务原子性和MVCC;redolog用于刷盘,保证事务持久性,更新磁盘数据页;

redo log的作用是为持久化而生的。
写redo log也是需要写磁盘的,但它的好处就是顺序IO(我们都知道顺序IO比随机IO快非常多)。
写完内存,如果数据库挂了,那我们可以通过redo log来恢复内存还没来得及刷到磁盘的数据,将redo log加载到内存里边,那内存就能恢复到挂掉之前的数据了。
如果我们内存的数据已经刷到了磁盘了,那redo log的数据就无效了。所以redo log不会存储着历史所有数据的变更,无效的 redo log文件的内容会被覆盖的。
redolog是MySQL的InnoDB引擎所产生的,毕竟是用来完成事务的,只有InnoDB存储引擎才有事务

binlog 记录的是数据的逻辑变化,binlog记载的是update/delete/insert这样的SQL语句;
redo log 记录的是数据的物理变化,redo log记载的是物理修改的内容(xxxx页修改了xxx)。
https://maoqizhi.blog.csdn.net/article/details/105647469

Checkpoint
死锁

工作中遇到insert on duplicate key update导致死锁
https://www.cnblogs.com/jay-huaxiao/p/11456921.html
https://www.jb51.net/article/196863.htm

解决方法:
1.先插后更新,如果没有索引,所以update会锁表,如果加了索引,就会锁行。

try{
   insert();   这里如果是批量插入就不行了
}catch(DuplicateKeyException e){
   update();
}

2.先删后插入,但是频繁删除会增加维护索引的开销,不推荐。
3.把插入任务放入单线程池执行,但是数据入库会有延迟,不推荐。
4.升级mysql到8.0版本。

小表使用全表扫描更快,中大表才使用索引。超级大表索引基本无效。

我们对method_name 使用了唯一索引,并且显示使用for update来使用行级锁。但是,MySql会对查询进行优化,即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价来决定的,如果 MySQL 认为全表扫效率更高,比如对一些很小的表,它就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。

MySql 的索引使用B+ 树和B树的区别

https://www.jb51.net/article/172038.htm

读写锁

互斥锁,简写为X锁,又称写锁。
一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。

共享锁,简写为S锁,又称读锁。
一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。

MVCC多版本并发控制

https://www.jb51.net/article/202110.htm

MySql 将数据按照页来存储,默认一页为 16kb,当你在查询时,不会只加载某一条数据,而是将这个数据所在的页都加载到 pageCache 中,这个其实和 OS 的就近访问原理类似。

顺丰快递:请签收MySQL灵魂十连
https://www.jb51.net/Special/621.htm

你可能感兴趣的:(【JAVA】MySQL总结)