返回顶部
首页 > 资讯 > 数据库 >MySQL的Searching rows for update状态是怎样的
  • 136
分享到

MySQL的Searching rows for update状态是怎样的

2024-04-02 19:04:59 136人浏览 独家记忆
摘要

这篇文章主要介绍“Mysql的Searching rows for update状态是怎样的”,在日常操作中,相信很多人在mysql的Searching rows for update状态是怎样的

这篇文章主要介绍“Mysql的Searching rows for update状态是怎样的”,在日常操作中,相信很多人在mysql的Searching rows for update状态是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql的Searching rows for update状态是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、限制条件

一般不能是唯一键和主键,也不能是全表,代码如下:

if (used_index != MAX_KEY) //不能是唯一键(主键) 和 全表 
  { // Check if we are modifying a key that we are used to search with:
    used_key_is_modified= is_key_used(table, used_index, table->write_set);//通过写位图write_set 进行确认 查询的条件和修改的条件相同
  }

2、进入状态

进入stage_searching_rows_for_update状态

THD_STAGE_INFO(thd, stage_searching_rows_for_update);
        ha_rows tmp_limit= limit;
        io_CACHE *tempfile= (IO_CACHE*) my_malloc(key_memory_TABLE_sort_io_cache,
                                                  sizeof(IO_CACHE),
                                                  MYF(MY_FAE | MY_ZEROFILL));

3、临时文件使用

创建MY开头的临时文件,在tmp目录下,扫描行加入到临时文件中,供后面实际的update操作使用,会进入实际的update操作会进入stage_updating状态,如下:

       if (open_cached_file(tempfile, mysql_tmpdir,TEMP_PREFIX,
                             DISK_BUFFER_SIZE, MYF(MY_WME)))//打开一个MY临时文件
        {
          my_free(tempfile);
          Goto exit_without_my_ok;
        }
        while (!(error=info.read_record(&info)) && !thd->killed)
        {
          thd->inc_examined_row_count(1);//扫描增加 
          bool skip_record= FALSE;
          if (qep_tab.skip_record(thd, &skip_record))
...

4、测试总结

mysql> show create table test0820;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                    |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test0820 | CREATE TABLE `test0820` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `name1` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_u_test` (`name1`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 主键ID更新不触发

  • 唯一键idx_u_test更新不触发

  • 普通索引name更新触发

如果update执行计划出现Using temporary 则会使用stage_searching_rows_for_update。

mysql> desc   update test0820 set name1='7' where name1='5';
+----+-------------+----------+------------+-------+---------------+------------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key        | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+------------+---------+-------+------+----------+-------------+
|  1 | UPDATE      | test0820 | NULL       | range | idx_u_test    | idx_u_test | 63      | const |    1 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+------------+---------+-------+------+----------+-------------+
1 row in set (2.58 sec)
mysql> desc   update test0820 set name='7' where name='5';
+----+-------------+----------+------------+-------+---------------+------+---------+-------+------+----------+------------------------------+
| id | select_type | table    | partitions | type  | possible_keys | key  | key_len | ref   | rows | filtered | Extra                        |
+----+-------------+----------+------------+-------+---------------+------+---------+-------+------+----------+------------------------------+
|  1 | UPDATE      | test0820 | NULL       | range | name          | name | 63      | const |    1 |   100.00 | Using where; Using temporary |
+----+-------------+----------+------------+-------+---------------+------+---------+-------+------+----------+------------------------------+
1 row in set (1.91 sec)
mysql> desc   update test0820 set id=2  where id=1;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | UPDATE      | test0820 | NULL       | range | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set (2.30 sec)

5、stage_searching_rows_for_update状态扫描数据已经加,因此很容易测试这种情况

栈帧:

#0  0x00007ffff7bd368c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000001b2f921 in os_event::wait (this=0x7ffee0e418e8) at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/include/os0event.h:156
#2  0x0000000001b2f269 in os_event::wait_low (this=0x7ffee0e418e8, reset_sig_count=1)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/os/os0event.cc:131
#3  0x0000000001b2f692 in os_event_wait_low (event=0x7ffee0e418e8, reset_sig_count=0)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/os/os0event.cc:328
#4  0x0000000001af0c4b in lock_wait_suspend_thread (thr=0x7ffee0e42ed0) at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/lock/lock0wait.cc:387
#5  0x0000000001bb6de8 in row_mysql_handle_errors (new_err=0x7fffec5eb7bc, trx=0x7fffd7804080, thr=0x7ffee0e42ed0, savept=0x0)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/row/row0mysql.cc:1312
#6  0x0000000001bf9ed6 in row_search_mvcc (buf=0x7ffee097fb40 "\377", mode=PAGE_CUR_GE, prebuilt=0x7ffee0e42730, match_mode=1, direction=0)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:6318
#7  0x0000000001a53113 in ha_innobase::index_read (this=0x7ffee0952030, buf=0x7ffee097fb40 "\377", key_ptr=0x7ffee0a2f6d0 "", key_len=63, find_flag=HA_READ_KEY_EXACT)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9536
#8  0x0000000000f933c2 in handler::index_read_map (this=0x7ffee0952030, buf=0x7ffee097fb40 "\377", key=0x7ffee0a2f6d0 "", keypart_map=1, find_flag=HA_READ_KEY_EXACT)
    at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.h:2942
#9  0x0000000000f83Dac in handler::ha_index_read_map (this=0x7ffee0952030, buf=0x7ffee097fb40 "\377", key=0x7ffee0a2f6d0 "", keypart_map=1, 
    find_flag=HA_READ_KEY_EXACT) at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.cc:3248
#10 0x0000000000f8e844 in handler::read_range_first (this=0x7ffee0952030, start_key=0x7ffee0952118, end_key=0x7ffee0952138, eq_range_arg=true, sorted=true)
    at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.cc:7750
#11 0x0000000000f8c775 in handler::multi_range_read_next (this=0x7ffee0952030, range_info=0x7fffec5ec370)
    at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.cc:6817
#12 0x0000000000f8d68d in DsMrr_impl::dsmrr_next (this=0x7ffee09524a0, range_info=0x7fffec5ec370) at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.cc:7204
#13 0x0000000001a6689a in ha_innobase::multi_range_read_next (this=0x7ffee0952030, range_info=0x7fffec5ec370)
    at /mysqldata/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:22211
#14 0x00000000017bdbd8 in QUICK_RANGE_SELECT::get_next (this=0x7ffee0e40250) at /mysqldata/percona-server-locks-detail-5.7.22/sql/opt_range.cc:11237
#15 0x00000000014e27f5 in rr_quick (info=0x7fffec5ec870) at /mysqldata/percona-server-locks-detail-5.7.22/sql/records.cc:399
#16 0x000000000168c103 in mysql_update (thd=0x7ffee0000c00, fields=..., values=..., limit=18446744073709551615, handle_duplicates=DUP_ERROR, 
    found_return=0x7fffec5ecbd8, updated_return=0x7fffec5ecbd0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_update.cc:691
#17 0x0000000001692e40 in Sql_cmd_update::try_single_table_update (this=0x7ffee0006bc0, thd=0x7ffee0000c00, switch_to_multitable=0x7fffec5ecc7f)
    at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_update.cc:2896
#18 0x000000000169338d in Sql_cmd_update::execute (this=0x7ffee0006bc0, thd=0x7ffee0000c00) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_update.cc:3023
#19 0x00000000015cc801 in mysql_execute_command (thd=0x7ffee0000c00, first_level=true) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:3756
#20 0x00000000015d2fde in mysql_parse (thd=0x7ffee0000c00, parser_state=0x7fffec5ee600) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:5901
#21 0x00000000015c6b72 in dispatch_command (thd=0x7ffee0000c00, com_data=0x7fffec5eed70, command=COM_QUERY)
    at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1490
#22 0x00000000015c58ff in do_command (thd=0x7ffee0000c00) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021
#23 0x000000000170e578 in handle_connection (arg=0x6795460) at /mysqldata/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312
#24 0x0000000001945538 in pfs_spawn_thread (arg=0x6947660) at /mysqldata/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190
#25 0x00007ffff7bcfaa1 in start_thread () from /lib64/libpthread.so.0
#26 0x00007ffff6b37c4d in clone () from /lib64/libc.so.6
T1T2
BEGIN;
delete from test0820;

update test0820 set name=’100’ where name=’90’

显示如下:

mysql> show processlist;
+----+-----------------+-----------+---------+---------+------+---------------------------+------------------------------------------------+-----------+---------------+
| Id | User            | Host      | db      | Command | Time | State                     | Info                                           | Rows_sent | Rows_examined |
+----+-----------------+-----------+---------+---------+------+---------------------------+------------------------------------------------+-----------+---------------+
|  1 | event_scheduler | localhost | NULL    | Daemon  | 4771 | Waiting on empty queue    | NULL                                           |         0 |             0 |
|  3 | root            | localhost | testmts | Query   |   28 | Searching rows for update | update test0820 set name='100' where name='90' |         0 |             0 |
|  7 | root            | localhost | testmts | Query   |    0 | starting                  | show processlist                               |         0 |             0 |
+----+-----------------+-----------+---------+---------+------+---------------------------+------------------------------------------------+-----------+---------------+
3 rows in set (0.01 sec)

到此,关于“MySQL的Searching rows for update状态是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的Searching rows for update状态是怎样的

本文链接: https://www.lsjlt.com/news/63441.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL的Searching rows for update状态是怎样的
    这篇文章主要介绍“MySQL的Searching rows for update状态是怎样的”,在日常操作中,相信很多人在MySQL的Searching rows for update状态是怎样的...
    99+
    2024-04-02
  • Searching rows for update状态初探
      一、背景说明  最近有位朋友咨询说为何如此多线程处于Searching rows for update,当时看到这个状态的第一反应就是锁,这里暂且抛开锁不谈,谈一谈为何出现Searching...
    99+
    2024-04-02
  • ADO.NET状态是怎样的
    这篇文章主要介绍“ADO.NET状态是怎样的”,在日常操作中,相信很多人在ADO.NET状态是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET状态是怎样的”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • Cache buffer的状态是怎样的
    Cache buffer的状态是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Buffer States数据库使用内部算...
    99+
    2024-04-02
  • Java线程状态是怎样的
    这篇文章主要介绍“Java线程状态是怎样的”,在日常操作中,相信很多人在Java线程状态是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程状态是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-19
  • mysql update的机制是怎么样的
    本篇文章为大家展示了mysql update的机制是怎么样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 可以看到,一个Update操...
    99+
    2024-04-02
  • BACKUP PENDING状态的解除是怎样的
    本篇文章为大家展示了BACKUP PENDING状态的解除是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。BACKUP PENDING状态的解除1、数据库比较...
    99+
    2024-04-02
  • mysql中的for update怎么用
    这篇文章主要介绍“mysql中的for update怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql中的for update怎么用”文章能帮...
    99+
    2024-04-02
  • redo的三种状态的恢复是怎样的
    这期内容当中小编将会给大家带来有关redo的三种状态的恢复是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CURRENT (1)如果有归档和备份,可以用不完全恢复...
    99+
    2024-04-02
  • 域名状态PENDINGDELETE的含义是怎么样的
    域名状态PENDINGDELETE的含义是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。域名状态PENDINGDELETE的含义.PENDINGDELETE:删除未决。...
    99+
    2023-06-12
  • MySQL5.6 Online DDL在线状态是怎么样的
    这篇文章将为大家详细讲解有关MySQL5.6 Online DDL在线状态是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 Yes*和No*表明结...
    99+
    2024-04-02
  • 服务器状态监测keepalived是怎样的
    今天就跟大家聊聊有关服务器状态监测keepalived是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。keepalived简介:keepalived是一个类似于layer3, ...
    99+
    2023-06-16
  • MySQL中update语句的执行过程是怎么样的
    这篇文章主要为大家展示了“MySQL中update语句的执行过程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中update语句的执行过程是...
    99+
    2024-04-02
  • RR模式下insert..selcet sending data状态是怎样的
    RR模式下insert..selcet sending data状态是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。例如:其中的se...
    99+
    2024-04-02
  • Android沉浸式状态栏的实现流程是怎样的
    本篇内容主要讲解“Android沉浸式状态栏的实现流程是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android沉浸式状态栏的实现流程是怎样的”吧!Android—沉浸式状态栏我们的征...
    99+
    2023-06-25
  • MySQL状态表的优化是什么
    本篇内容介绍了“MySQL状态表的优化是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自打构建数据源集...
    99+
    2024-04-02
  • Linux Shell脚本监控WAS的运行状态是怎么样的
    今天就跟大家聊聊有关Linux Shell脚本监控WAS的运行状态是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原理:通过调用 WAS 自带的脚本 wsadmin.sh 来...
    99+
    2023-06-16
  • C/C++ Qt StatusBar底部状态栏应用是怎么样的
    这篇文章将为大家详细讲解有关C/C++ Qt StatusBar底部状态栏应用是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Qt窗体中默认会附加一个Qstatu...
    99+
    2023-06-21
  • ASP.NET的HTTP模块和处理程序对话状态是怎样的
    这篇文章主要介绍“ASP.NET的HTTP模块和处理程序对话状态是怎样的”,在日常操作中,相信很多人在ASP.NET的HTTP模块和处理程序对话状态是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP...
    99+
    2023-06-17
  • SAP CRM的状态管理和权限控制的集成是怎样的
    SAP CRM的状态管理和权限控制的集成是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CRM状态管理框架支持以下授权概念。客户可以选择仅特定用户组(具有...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作