truncate导致慢查询根因竟然是“多此一举”

news2024/12/23 9:08:24

基本信息:

        线上一个库5.7.25库经常出现大量慢查询,在再次出现时登陆数据库进行分析,通过show engine innodb status 内容,发线程全部在等一个锁,这个锁极可能来源于这个truncate table动作:

---TRANSACTION 4764270793, ACTIVE 12 sec truncating table
mysql tables in use 1, locked 1
0 lock struct(s), heap size 1136, 0 row lock(s)
MySQL thread id 41, OS thread handle 140094989018880, query id 4942655207 System lock
Alter table xxxxx truncate partition p20210812

        这个动作进行了12秒,仔细检查等锁的100来个线程,没有超过12秒的,几乎可以认定都是由这个truncate 动作引发的等待。

进一步分析:

        分析正在等锁的线程,因为都一样,以其中一个线程为例展开分析:

--Thread 140093981456128 has waited at btr0sea.ic line 128 for 12.00 seconds the semaphore:
S-lock on RW-latch at 0x285e848 created in file btr0sea.cc line 230
a writer (thread id 140094867109632) has reserved it in mode  wait exclusive
number of readers 1, waiters flag 1, lock_word: ffffffffffffffff
Last time read locked in file btr0sea.ic line 128
Last time write locked in file /home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic line 90

        由于 show engine innodb status 内容,信息较少,结合现场抓到的堆栈信息分析,将上面Thread 140093981456128 转换成16进制,到得 7F6A2BFFF700,从打印的堆栈找到对应线程的堆栈如下:

Thread 227 (Thread 0x7f6a2bfff700 (LWP 480928)):  
#0  0x00007f7b7e3dc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x000000000107cbab in wait (this=<optimized out>) at /home/service/percona-server-5.7.25-28/storage/innobase/include/os0event.h:156
#2  wait_low (reset_sig_count=<optimized out>, this=0x285e880) at /home/service/percona-server-5.7.25-28/storage/innobase/os/os0event.cc:131
#3  os_event_wait_low (event=0x285e880, reset_sig_count=<optimized out>) at /home/service/percona-server-5.7.25-28/storage/innobase/os/os0event.cc:328
#4  0x000000000113af0b in sync_array_wait_event (arr=arr@entry=0x2407ef8, cell=@0x7f6a2bff88f0: 0x7f7b71aa7028) at /home/service/percona-server-5.7.25-28/storage/innobase/sync/sync0arr.cc:475
#5  0x000000000113ca1c in rw_lock_s_lock_spin (lock=lock@entry=0x285e848, pass=pass@entry=0, file_name=file_name@entry=0x15bd9f8 "/home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic", line=line@entry=128) at /home/service/percona-server-5.7.25-28/storage/innobase/sync/sync0rw.cc:419
#6  0x00000000011b8c3e in rw_lock_s_lock_func (pass=0, line=128, file_name=0x15bd9f8 "/home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic", lock=0x285e848) at /home/service/percona-server-5.7.25-28/storage/innobase/include/sync0rw.ic:433
#7  pfs_rw_lock_s_lock_func (pass=0, line=128, file_name=0x15bd9f8 "/home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic", lock=0x285e848) at /home/service/percona-server-5.7.25-28/storage/innobase/include/sync0rw.ic:796
#8  btr_search_s_lock (index=0x7f64c9de9a08) at /home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic:128
#9  btr_search_build_page_hash_index (index=0x7f64c9de9a08, block=block@entry=0x7f7734a5df40, n_fields=2, n_bytes=0, left_side=0) at /home/service/percona-server-5.7.25-28/storage/innobase/btr/btr0sea.cc:1519
#10 0x00000000011b9a62 in btr_search_info_update_slow (info=<optimized out>, cursor=cursor@entry=0x7f6a407669a8) at /home/service/percona-server-5.7.25-28/storage/innobase/btr/btr0sea.cc:826
#11 0x00000000011aad36 in btr_search_info_update (cursor=0x7f6a407669a8, index=0x7f64c9de9a08) at /home/service/percona-server-5.7.25-28/storage/innobase/include/btr0sea.ic:81
#12 btr_cur_search_to_nth_level (index=index@entry=0x7f64c9de9a08, level=level@entry=0, tuple=0x7f6a40767a10, mode=mode@entry=PAGE_CUR_LE, latch_mode=latch_mode@entry=1, cursor=cursor@entry=0x7f6a407669a8, has_search_latch=has_search_latch@entry=0, file=file@entry=0x15ae570 "/home/service/percona-server-5.7.25-28/storage/innobase/row/row0sel.cc", line=line@entry=3546, mtr=mtr@entry=0x7f6a2bffccf0) at /home/service/percona-server-5.7.25-28/storage/innobase/btr/btr0cur.cc:2015
#13 0x00000000010f9ccb in btr_pcur_open_with_no_init_func (latch_mode=1, file=0x15ae570 "/home/service/percona-server-5.7.25-28/storage/innobase/row/row0sel.cc", mtr=0x7f6a2bffccf0, line=3546, has_search_latch=0, cursor=0x7f6a407669a8, mode=PAGE_CUR_LE, tuple=<optimized out>, index=0x7f64c9de9a08) at /home/service/percona-server-5.7.25-28/storage/innobase/include/btr0pcur.ic:535
#14 row_sel_get_clust_rec_for_mysql (prebuilt=prebuilt@entry=0x7f6a40766678, sec_index=sec_index@entry=0x7f64c9a73648, rec=rec@entry=0x7f70cc62c58a "1000113461", thr=thr@entry=0x7f6a40983748, out_rec=out_rec@entry=0x7f6a2bffc0f0, offsets=offsets@entry=0x7f6a2bffc120, offset_heap=offset_heap@entry=0x7f6a2bffc110, vrow=0x0, mtr=mtr@entry=0x7f6a2bffccf0) at /home/service/percona-server-5.7.25-28/storage/innobase/row/row0sel.cc:3546
#15 0x0000000001102e10 in row_search_mvcc (buf=buf@entry=0x7f6a407e10e0 "\220\340\377\377\307\177\204\300\a\374\245\226院", mode=<optimized out>, mode@entry=PAGE_CUR_UNSUPP, prebuilt=0x7f6a40766678, match_mode=match_mode@entry=0, direction=direction@entry=1) at /home/service/percona-server-5.7.25-28/storage/innobase/row/row0sel.cc:5966
#16 0x0000000000feb3ab in ha_innobase::general_fetch (this=this@entry=0x7f6a403a42c0, buf=buf@entry=0x7f6a407e10e0 "\220\340\377\377\307\177\204\300\a\374\245\226院", direction=direction@entry=1, match_mode=match_mode@entry=0) at /home/service/percona-server-5.7.25-28/storage/innobase/handler/ha_innodb.cc:10237
#17 0x0000000000feb70d in ha_innobase::index_next (this=this@entry=0x7f6a403a42c0, buf=buf@entry=0x7f6a407e10e0 "\220\340\377\377\307\177\204\300\a\374\245\226院") at /home/service/percona-server-5.7.25-28/storage/innobase/handler/ha_innodb.cc:10312
#18 0x0000000001003e5d in ha_innopart::read_range_next_in_part (this=0x7f6a403a42c0, part=29, record=0x0) at /home/service/percona-server-5.7.25-28/storage/innobase/handler/ha_innopart.cc:2347
#19 0x0000000000bb4b58 in Partition_helper::handle_unordered_next (this=0x7f6a403a47c0, buf=0x7f6a407e10e0 "\220\340\377\377\307\177\204\300\a\374\245\226院", is_next_same=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/partitioning/partition_handler.cc:3076
#20 0x00000000007b3882 in handler::multi_range_read_next (this=0x7f6a403a42c0, range_info=0x7f6a2bffd2e0) at /home/service/percona-server-5.7.25-28/sql/handler.cc:6859
#21 0x0000000000dd94eb in QUICK_RANGE_SELECT::get_next (this=0x7f67c9235680) at /home/service/percona-server-5.7.25-28/sql/opt_range.cc:11248
#22 0x0000000000bb684a in rr_quick (info=0x7f67c98796d0) at /home/service/percona-server-5.7.25-28/sql/records.cc:399
#23 0x0000000000c25d97 in sub_select (join=0x7f67c8f85fe8, qep_tab=0x7f67c9879680, end_of_records=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:1280
#24 0x0000000000c1ec57 in do_select (join=0x7f67c8f85fe8) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:950
#25 JOIN::exec (this=this@entry=0x7f67c8f85fe8) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:199
#26 0x0000000000c1aa24 in TABLE_LIST::materialize_derived (this=this@entry=0x7f67c801bf30, thd=thd@entry=0x7f67c8a98300) at /home/service/percona-server-5.7.25-28/sql/sql_derived.cc:326
#27 0x0000000000c1f67f in join_materialize_derived (tab=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:2506
#28 0x0000000000c1f172 in QEP_TAB::prepare_scan (this=0x7f67c8a7cd80) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:1331
#29 0x0000000000c25c90 in sub_select (join=0x7f67c8f85c00, qep_tab=0x7f67c8a7cd80, end_of_records=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:1231
#30 0x0000000000c1ec57 in do_select (join=0x7f67c8f85c00) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:950
#31 JOIN::exec (this=0x7f67c8f85c00) at /home/service/percona-server-5.7.25-28/sql/sql_executor.cc:199
#32 0x0000000000c8d61d in handle_query (thd=thd@entry=0x7f67c8a98300, lex=lex@entry=0x7f67c8a9a740, result=result@entry=0x7f67c801de08, added_options=added_options@entry=0, removed_options=removed_options@entry=0) at /home/service/percona-server-5.7.25-28/sql/sql_select.cc:185
#33 0x0000000000774714 in execute_sqlcom_select (thd=thd@entry=0x7f67c8a98300, all_tables=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:5467
#34 0x0000000000c5145d in mysql_execute_command (thd=thd@entry=0x7f67c8a98300, first_level=first_level@entry=true) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:2994
#35 0x0000000000c545f5 in mysql_parse (thd=thd@entry=0x7f67c8a98300, parser_state=parser_state@entry=0x7f6a2bffe6f0, update_userstat=update_userstat@entry=false) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:5901
#36 0x0000000000c55196 in dispatch_command (thd=thd@entry=0x7f67c8a98300, com_data=com_data@entry=0x7f6a2bffedc0, command=COM_QUERY) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:1528
#37 0x0000000000c56b37 in do_command (thd=thd@entry=0x7f67c8a98300) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:1053
#38 0x0000000000d12348 in handle_connection (arg=arg@entry=0x2b4adb0) at /home/service/percona-server-5.7.25-28/sql/conn_handler/connection_handler_per_thread.cc:318
#39 0x0000000000ef80b1 in pfs_spawn_thread (arg=0x297d550) at /home/service/percona-server-5.7.25-28/storage/perfschema/pfs.cc:2190
#40 0x00007f7b7e3d8dd5 in start_thread () from /lib64/libpthread.so.0
#41 0x00007f7b7d09e02d in clone () from /lib64/libc.so.6

        这个堆栈非常长,是在做一个比较复杂的查询,挑选靠近等锁部分函数分析:row_search_mvcc -> row_sel_get_clust_rec_for_mysql ->btr_pcur_open_with_no_init_func->btr_cur_search_to_nth_level->btr_search_info_update->btr_search_info_update_slow->btr_search_build_page_hash_index->btr_search_s_lock->pfs_rw_lock_s_lock_func。

        前面是常规的调用路径,从 btr_cur_search_to_nth_level 函数开始分析,当打开 AHI 的时候,会调用btr_search_info_update 来更新相应的统计信息,如果当前的索引的统计到被扫描次数达到17次,则要调用 btr_search_info_update_slow 更新 search info & block info 信息,也就是说要将经常使用的索引加到AHI中,此时需要对AHI的加锁,根因就是这把锁加不上,都在等这个锁:

         如上代码,在btr_search_build_page_hash_index 中对index加锁,这个index就是AHI的锁,所有线程都是卡这等锁,但等的不一定是同一把锁,因为AHI 根据 innodb_adaptive_hash_index_parts 参数拆分成了多把,但等锁的根因在此,一直加不上这个锁就一直在等,导致慢查询。

为什么这个锁长时间拿不到?

         再来分析最可疑的truncate动作在干什么,同样根据Thread 140093981456128  转换的指针 0x7f6a680e2700找到对应堆栈如下:

Thread 306 (Thread 0x7f6a680e2700 (LWP 1923)):
#0  0x00000000011f88f7 in buf_LRU_drop_page_hash_for_tablespace (id=<optimized out>, buf_pool=<optimized out>) at /home/service/percona-server-5.7.25-28/storage/innobase/buf/buf0lru.cc:287
#1  buf_LRU_flush_or_remove_pages (id=id@entry=141593, buf_remove=buf_remove@entry=BUF_REMOVE_ALL_NO_WRITE, trx=trx@entry=0x0) at /home/service/percona-server-5.7.25-28/storage/innobase/buf/buf0lru.cc:994
#2  0x000000000124b3fc in fil_reinit_space_header_for_table (table=table@entry=0x7f6920aecf48, size=7, trx=trx@entry=0x7f7b716a71d0) at /home/service/percona-server-5.7.25-28/storage/innobase/fil/fil0fil.cc:3275
#3  0x000000000110aef5 in row_truncate_table_for_mysql (table=<optimized out>, trx=0x7f7b716a71d0) at /home/service/percona-server-5.7.25-28/storage/innobase/row/row0trunc.cc:2090
#4  0x0000000000fff2a4 in ha_innopart::truncate (this=0x7f686f1d5420) at /home/service/percona-server-5.7.25-28/storage/innobase/handler/ha_innopart.cc:3211
#5  0x0000000000e2939d in truncate_partition (this=0x7f686f1d59f8) at /home/service/percona-server-5.7.25-28/sql/partitioning/partition_handler.h:278
#6  Sql_cmd_alter_table_truncate_partition::execute (this=<optimized out>, thd=0x7f6a3c0008c0) at /home/service/percona-server-5.7.25-28/sql/sql_partition_admin.cc:787
#7  0x0000000000c4e4e2 in mysql_execute_command (thd=thd@entry=0x7f6a3c0008c0, first_level=first_level@entry=true) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:5132
#8  0x0000000000c545f5 in mysql_parse (thd=0x7f6a3c0008c0, parser_state=parser_state@entry=0x7f6a680e1c20, update_userstat=update_userstat@entry=true) at /home/service/percona-server-5.7.25-28/sql/sql_parse.cc:5901
#9  0x0000000000e5331f in Query_log_event::do_apply_event (this=0x7f6a480f7450, rli=0x7f6a48023da0, query_arg=0x7f6a4842a342 "Alter table rpt_ads_base_busi_game_app_perf_m truncate partition p20210812", q_len_arg=<optimized out>) at /home/service/percona-server-5.7.25-28/sql/log_event.cc:4916
#10 0x0000000000eb531f in slave_worker_exec_job_group (worker=worker@entry=0x7f6a48023da0, rli=rli@entry=0x29f21b0) at /home/service/percona-server-5.7.25-28/sql/rpl_rli_pdb.cc:2743
#11 0x0000000000e986b3 in handle_slave_worker (arg=arg@entry=0x7f6a48023da0) at /home/service/percona-server-5.7.25-28/sql/rpl_slave.cc:6270
#12 0x0000000000ef80b1 in pfs_spawn_thread (arg=0x7f6a48027c40) at /home/service/percona-server-5.7.25-28/storage/perfschema/pfs.cc:2190
#13 0x00007f7b7e3d8dd5 in start_thread () from /lib64/libpthread.so.0
#14 0x00007f7b7d09e02d in clone () from /lib64/libc.so.6

         显然这正是在做truncate的动作,这里的做buf_LRU_flush_or_remove_pages 时,会调用到 buf_LRU_drop_page_hash_for_tablespace 函数,从堆栈上可以看出最底层的函数buf_LRU_drop_page_hash_for_tablespace 并没有等任何锁,应该是在做大任务,分析该函数代码:

         它要对buffer_pool instance加锁,然后遍历该Buffer pool的每个页面,和当前被Truncate的表所有页面比较,然后在该buffer pool中清理掉当前表的页面,期间如果对该buffer pool instance的页面申请操作都会等,一直等truncate table完成。并且这个操作不是只操作一个buffer pool instance,所有的都要,也就是说要把整个buffer pool内存都扫一遍: 

          假如要清理的表占用1万个页面(约160MB),buffer pool总有占有50万个脏页,双重循环运算量非常大。虽然说全内存很快,但这个量太大了,导致加锁时间会比较长,虽然buffer pool的已经拆分降低等锁时间,但这里还是容易成为瓶颈点,这是强制全部检查清理的设计逻辑似乎可以优化。虽然说情理上看,锁住buf pool其它线程就无法再向该buf pool申请页面,拒绝AHI操作勉强说的通,但AHI那边等锁就一定有人拿着它锁,继续向上层分析。看上层函数 fil_reinit_space_header_for_table :

         在做 buf_LRU_flush_or_remove_pages 清理前,会对所有的AHI 加锁,不管拆分了几个,大表truncate时几乎逃不过卡的命运了,只要开了AHI,经常命中的数据就可能要被挂AHI上,那么就需要加这个锁,而这个锁在truncate过程中是不会释放的,那么就可能会导致所有的查询都等在这。

小结:

        truncate table动作要对所有AHI加锁,禁止更新AHI,等被truncate的表在全部buf pool中清理完自己的页面再放锁。查询线程因为打开了AHI,在查询过程中会将高频命中的索引加到AHI中去,提高查询效率,该过程要对index对应的AHI加锁,但该锁被truncate动作持有,要等着truncate完成,导致等在这,并且这里truncate是要持有所有AHI的锁,完全禁止AHI更新,所以truncate A 表时查B表一样可能会被卡住。

优化建议:

1. 将这个分区的truncate改成drop+create

当 innodb_file_per_table = on 时,也就是每个表都有独立ibd文件时,truncate就等于drop + create,下面是官方文档说明:

        官方在对drop做了lazy drop优化,不需要立马清理buf pool,持锁时间短, 理论会更好。但要是并发删除多个大表可能会带来其它性能问题,如果仅是单线程drop大表可以尝试。

2. 删除动作前禁用AHI功能,删除后再打开

        AHI是一个锦上添花的功能,只会对已经在Cache中多次命中的索引建立自适应哈希索引,也就是说内存中已经有了,优化点在于走常规索引搜索链路可能3~4层,走AHI索引检索一两层就能找到。这些都是内存操作,临时关掉影响应该不大,可以做尝试。但这个设置对从库不生效,row模式Binlog中不会记录这个AHI参数的变化。

3. 拆分成多条Delete。

        如果没有时效性要求,可以将一个完整的truncate拆分成多个Delete慢慢执行,好处是主从都不会有大负荷,delete不需要强制清buf pool页面,坏处是会产生很多binlog(row模式)。truncate表只有一条binlog,DELETE就纯看表数据,如果有表1000万行就会产生1000万条删除的binlog,执行时间可能是直接truncate的几十倍甚至几百倍都可能,取决于表的数据量。

4. 升级MySQL

        从上面分析可以看出来,这个问题明显是官方设计上的不够完美导致,搜了一下发现官方也是一直知道这个问题的,终于在5.7.34和8.0.23对此做了优化,所以要升级版本后能解决该问题。

好事的后记

       慢的根本原因就是truncate时对所有的AHI缓存instance加了锁,导致其它要用AHI的内存线程加不上这个锁,所以等在这。一定也有人很好奇,官方是怎么修复的?

      官方的修复方式让人惊掉下巴!!!

      一共改了两行代码,把 fil_reinit_space_header_for_table 函数中对所有的AHI加锁的逻辑去掉了,并且是直接去掉,没有其它任何改动。官方说经过仔细研究,这里的加锁是多此一举,前面的逻辑已经可以确保不要这个锁不会有问题的。。。

     这么多年,因此而引发的多少线上故障,皆付笑谈中。。。

patch SHA: f849f27e01f5e414bcaa995a3ba460782a1f8766 ,有兴趣的可以自己去看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】widgets (5) Flutter 理解 Flutter 的 Stateful Widget 有状态组件

文章目录 一、前言二、Stateful Widget三、StatefulWidget和State类的关系四、创建StatefulWidget五、完整代码示例六、总结一、前言 在之前的教程中,我们掌握了Stateless Widgets,也就是无状态组件的基本用法。 但是,应用程序不是静态不变的,我们需要界面中用户的操作,…

OCP浸没式液冷基本规范(概述和信号完整性部分)

液冷技术概述和浸没式液体标准化的需求 数据中心行业主要考虑两种类型的液体冷却技术来推动节能和可持续发展&#xff0c;分别是冷板式和浸没式&#xff0c;每一种技术里的液体又包含单相和双相两种规格&#xff1a; 冷板技术与浸没技术的主要区别之一是&#xff0c;在浸没的情…

操作系统原理 —— 什么是基本分页存储管理?(二十二)

在操作系统中&#xff0c;一个新的进程需要载入内存当中执行&#xff0c;在装入的时候需要给该进程分配一定的运行内存&#xff0c;在之前的章节中讲解了连续分配的几种方式&#xff0c;比如&#xff1a;单一连续分配、固定分区分配、动态分区分配&#xff0c;还讲解了对应的动…

MySQL表相关操作

一、存储引擎介绍 存储引擎即表类型&#xff0c;mysql根据不同的表类型会有不同的处理机制 1、什么是存储引擎 mysql中建立的库 > 文件夹 库中建立的表 > 文件 现实生活中我们用来存储数据的文件有不同的类型&#xff0c;每种文件类型对应各自不同的处理机制&#x…

基于LPP算法实现MNIST数据集降维

目录 1、作者介绍2、LPP算法简介2.1 基本概念及原理2.2 算法流程 3、LPP算法实现3.1 数据集简介3.2 代码实现3.2.1 完整代码3.2.2 运行结果 4、参考链接 1、作者介绍 刘晨雨&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;…

低代码开发重要工具:jvs-rules 规则引擎功能介绍(四)

一、策略管理 JVS-Rules采用业务与技术分离的思路&#xff0c;业务人员可以配置和业务相关的内容&#xff0c;可以不考虑底层变量的配置&#xff0c;只需要配置对业务的描述&#xff0c;具体实现的变量绑定可以由技术人员参与&#xff0c;这里就体现了技术与业务规则可以解耦。…

值得收藏的20张小学语文思维导图

思维导图不仅在我们的工作生活中起到越来越重要的作用&#xff0c;也在悄无声息中进入到了我们小学生的课堂。 有需要的家长赶快帮自家的宝贝收藏起来吧&#xff01; 小学语文_ProcessOn思维导图流程图https://link.zhihu.com/?targethttps%3A//www.processon.com/template/s…

leetcode 二分查找小结

文章目录 题目34. 在排序数组中查找元素的第一个和最后一个位置240. 搜索二维矩阵378. 有序矩阵中第 K 小的元素287. 寻找重复数33. 搜索旋转排序数组 总结 题目 34. 在排序数组中查找元素的第一个和最后一个位置 原始思路&#xff1a; class Solution:def searchRange(self,…

Python实现的端午节吃棕子除五毒体感小游戏源码,利用Paddlehub制作的端午体感小游戏,根据摄像头识别的人脸进行控制

利用Paddlehub制作端午体感小游戏 前言 马上要端午节,所以干脆再重写一些逻辑,做个端午节定制小游戏吧. 端午特色 游戏的贴图全换成了端午节相关贴图:三种粽子造型 雄黄酒 以及五毒:蛇,壁虎,蜈蚣,蟾蜍,蟹子 其实五毒也是我在逛了粽子博物馆才看到的哈哈哈,所以虽…

Jmeter+jenkins+ant自动化测试环境搭建

环境&#xff1a;Windows 一、准备安装包 JDK:jdk1.8.0_191 Jmeter:apache-jmeter-5.0 ANT:apache-ant-1.10.7 Jenkins:Jenkins2.233 二、安装JDK 下载地址&#xff1a;https://www.oracle.com/java/technologies/javase-downloads.html 下载后一直下一步即可 1、配置…

模型服务文档自动生成,要素追溯关联、结构规范易读|ModelWhale 版本更新

整装待发的初夏&#xff0c;ModelWhale 持续聚焦 AI for Science&#xff0c;针对大模型等前沿带来了新一轮的版本更新&#xff0c;期待为你提供更好的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 新增 模型服务文档自动生成&#xf…

美团4.27---实习--【第三档】

1.什么时候重写equals和hashCode方法&#xff1f; /*因为Object中默认的equals方法&#xff0c;内部还是使用来比较对象在内存中的地址&#xff0c;所以结果位false*//*如果重写了equals方法&#xff0c;那么如果两个对象的属性值相同&#xff0c;那么程序会在第三步判断中返回…

Day_46快速排序

目录 一. 关于快速排序思路的产生 二. 快速排序的实现 1. 快速排序的实现 2. 快速排序的效率分析 三. 快速排序的代码实现 1. 快速排序 2. 快速排序核心代码&#xff1a; 四. 代码展示 五. 数据测试 六. 总结 一. 关于快速排序思路的产生 从现在开始&#xff0c;让我们假设…

Hive学习---7、企业级调优

1、企业级调优 1.1 计算资源配置 到此学习的计算环境为HIve on MR。计算资源的调整主要包括Yarn和MR。 1.1.1 Yarn资源配置 1、Yarn配置说明 需要调整的Yarn的参数均与CPU、内存等资源有关&#xff0c;核心配置参数如下&#xff1a; &#xff08;1&#xff09;yarn.nodeman…

Python 三局两胜小游戏

文章目录 1. 明确项目目标2. 分析过程&#xff0c;拆解项目3. 逐步执行 代码实现版本1&#xff1a;版本2&#xff1a;【格式化字符串 %】 1. 明确项目目标 今天且让我扮演一下产品经理的角色。我们此次要实现的需求是&#xff1a;人机PK小游戏。具体效果请参照下面的示意动图。…

OpenGL之VAO,VBO和EBO

一、BO&#xff08;Buffer Object&#xff0c;缓冲对象&#xff09; 缓冲对象是OpenGL管理的一段内存&#xff0c;为了与我们CPU的内存区分开&#xff0c;一般称OpenGL管理的内存为&#xff1a;显存。 显存&#xff0c;也就是显卡里的内存。显卡访问显存比较快&#xff0c;而Bu…

vue3 element-plus 暗黑模式(主题切换)简易版

暗黑模式是说明 暗黑模式是指在应用程序或操作系统中使用暗色背景和浅色文本的界面设计。与传统的亮色模式相比&#xff0c;暗黑模式具有以下特点&#xff1a; 减少眼部疲劳&#xff1a;使用暗色背景可以减少屏幕发出的蓝光&#xff0c;减轻长时间使用电子设备对眼睛的疲劳程度…

【算法与数据结构】707.、LeetCode设计链表

文章目录 一、题目二、设计链表三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、设计链表 思路分析&#xff1a;这里我将的成员函数放在类外实现了&#xff0c;这样链表类看起来更加简洁&#xff0c;方便大家…

mysql之uniquekey学习。

uniquekey就真的是唯一键了吗&#xff1f; 答案是不是的。可以允许多个重复null值的存在&#xff0c;版本5.73 CREATE TABLE student_uniq ( id int(11) DEFAULT NULL, name varchar(200) DEFAULT NULL, socre int(11) DEFAULT NULL, UNIQUE KEY s_uniq (socre,name) )…

【操作系统】Linux进阶必须掌握的进程、线程及调度算法~进程学习

Linux内核源代码中&#xff0c;进程的状态是用数字来表示的&#xff0c;为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内核里面&#xff0c;进程有时候也叫任务&#xff09; /* The task state arra…