首页 > 数据库 >决战圣地玛丽乔亚Day18----关于mysql死锁+ mysql索引的数据结构相关

决战圣地玛丽乔亚Day18----关于mysql死锁+ mysql索引的数据结构相关

时间:2023-02-23 01:55:23浏览次数:48  
标签:事务 hash 查询 索引 死锁 mysql 乔亚 节点

Mysql为什么会产生死锁?

 事务A、B分别拿到1,4的独占行锁,然后再去拿4,1的行锁,都会由于另一个事务不释放锁等待,造成了循环等待的局面。

  • (1)同一时刻只能有一个事务持有这把锁;

  • (2)其他的事务需要在这个事务释放锁之后才能获取锁,而不可以强行剥夺;

  • (3)当多个事务形成等待环路的时候,即发生死锁。

 

如何去检测死锁?

show status命令查看行锁相关参数

show status like 'innodb_row_lock_%';

lnnodb_row_lock_current_waits:当前正在等待锁定的数量;
lnnodb_row_lock_time :从系统启动到现在锁定的总时间长度,单位ms;
Innodb_row_lock_time_avg :每次等待所花平均时间;
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间;
lnnodb_row_lock_waits :从系统启动到现在总共等待的次数。

show status只是来看一下大概的情况,具体情况还需要用到Innodb提供的三张表

具体的处理:

通过这三条命令看锁和事务的关系

select * from information_schema.INNODB_TRX; --当前运行的所有事务﹐还有具体的语句
select* from information_schema.INNODB_LOCKS; --当前出现的锁
select * from information_schema.INNODB_LOCK_WAITS; --锁等待的对应关系

kill掉事务的线程id     INNODB_TRX表中的trx_mysql_thread_id

但是kill需要手动,我们不可能每次都自己去kill掉死锁问题,还是应该从代码层出发,尽量不让死锁发生。

  • 1、在程序中,操作多张表时,尽量以相同的顺序来访问(避免形成等待环路)

  • 2、批量操作单张表数据的时候,先对数据进行排序(避免形成等待环路);

  • 3、申请足够级别的锁,如果要操作数据,就申请排它锁;

  • 4、尽量使用索引访问数据,避免没有where条件的操作,避免锁表;

  • 5、如果可以,大事务化成小事务;

  • 6、使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。

 

 

Mysql索引的数据结构:

Hash:

myisam和innodb都不支持hash索引。

hash索引是基于hash表来实现,那么就是两次查询,第一次根据hash值找到hash表对应的位置,然后根据位置上的值找到数据。

只有查询条件在精确匹配hash表的所有值得时候,才用到hash索引。  hash索引包括一个hash码,键值和指针。

既然是hash表的形式,那么hash的缺点也就很明显:
1.二次查找的性能消耗。

2.hash值碰撞问题,如果冲突,那么找到新位置的性能消耗很大。

3.hash索引没有办法外排序,因为他存的不是实际的数据值,而是hash码

4.最重要的一点!hash不支持范围索引,只有在等值索引才能派上用场。

 

B+树和B树:

B树:

 

 B+树:

 

 不难看出B树键和值放在每个节点。 B+树的内部节点只存储键,在叶子节点存键值并且用链表串起来。

B+树和Hash的优缺点:

Hash由于通过hash函数去hash表获取相应键值,然后再回表查询对应的值得特性。

1.由于hash索引建立的无序,所以不能范围查找,只能等值查找。

2.必须要回表,B+树在覆盖索引和聚簇索引可以不回表。

3.虽然hash等值查找快,但是由于hash碰撞会带来不确定性,不推荐用hash

 

B+树和B树:

B树由于内部存放键和值,如果把热点数据放在接近根节点的位置,查询效率更高。所以B+树在特定数据重复多次查询场景更高效。

B+树由于叶子节点存值,内部节点只存键。因此内存页可以存更多的键,对于数据量高的情况下,B+树更有优势。

1.B树不支持顺序索引,B+树支持

2.相同IO次数,B+树空间利用率高,读写的代价更低

3.B树的查询效率不稳定,由于不确定关键字在树的哪个位置,相当于不断做二分查找,最快一次,最慢就不知道了。

   B+树的查询效率很稳定,因为每个数据的查询至少都要走到叶子节点。

4.B树没有解决遍历的问题,B+树通过把叶子节点链表存储解决。

5.增删效率方面,B+树由于可以顺序查找,效率一定是更高的。

 

 

聚簇索引和非聚簇索引:

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

非聚簇索引:

 

Full-text:

标签:事务,hash,查询,索引,死锁,mysql,乔亚,节点
From: https://www.cnblogs.com/dwj-ngu/p/17144543.html

相关文章

  • python 把mysql数据导入到execl中
    importpymysqlimportpandasaspddb=pymysql.connect(host='127.0.0.1',user='root',passwd='123456',port=3306,database='world',......
  • mysql备份
    mysql备份1.备份的分类完全备份增量备份差异备份2.备份的方式1,使用专用的备份工具---mysqldump(1)对单个库进行完全备份mysqldump-h[mysql_address]-u[userna......
  • 6.mysql优化案例
    1.单表优化;   进行优化:删除原来的三个字段的索引,创建二个字段的索引;    2.两表关联:左连接,在右表创建索引 右连接,在左表创建......
  • MySQL查询(二)
    MySQL查询(二)函数调用:select函数名(实参列表)[from表]1.常见函数1.1.单行函数字符函数length获取参数值的字节个数,一个字母是1个字节,一个汉字3个字节sele......
  • MySQL函数
     GROUP_CONCATSUBSTRING_INDEX例子:SUBSTRING_INDEX(GROUP_CONCAT(ll.xorderbyll.seqdesc,ll.createdesc),",",2) mysql中函数CONCAT及GROUP_CONCAT的使用ht......
  • MySQL 8.0 新特性-原子DDL
    背景MySQL8.0原子DDL是一个复杂的过程,涉及比较多的模块,例如:MDL锁,表定义缓存,行格式,RowLog,DDLLog,online属性,表空间物理文件操作等。本文主要通过与MySQL 5.7版本的......
  • 在Centos8/OpenEuler中安装MySQL
    在Centos8/OpenEuler中安装MySQL5.6/5.7  在Centos8/OpenEuler中安装MySQL5.6/5.7时,我们会遇到以下依赖问题:[root@node1~]#rpm-ivhMySQL-client-5.6.26-1.rhel5.x86......
  • es 集成logstash 同步mysql数据
    安装wgethttps://artifacts.elastic.co/downloads/logstash/logstash-7.14.0-linux-x86_64.tar.gz解压tar-zxvflogstash-7.14.0-linux-x86_64.tar.gz 移动 mvlo......
  • mysql 中实现递归树,类似oralce CONNECT BY PRIOR... START WITH
    CREATEDEFINER=`root`@`%`FUNCTION`getChildList`(rootIdVARCHAR(255))RETURNSmediumtextCHARSETutf8mb4BEGINDECLAREsTempMEDIUMTEXT;DECLA......
  • Linux忘记mysql密码,重置ysql密码
    1.修改配置文件,无需密码登录sudovim/etc/my.cnf在最底下添加一行:skip-grant-tables重启mysqlsystemctlrestartmysqld  2.登录mysql,修改密码输入mysql......