admin

  • 最近,公司组织了一个24点SQL编程的比赛,笔者是主办方,也是评委。既然是做评委,自己也先挑战了一下,因为对MySQL更为熟悉,故选择了MySQL作为编程SQL。周末花了一些时间挑战一下,这里记录一下自己的解法以及思路。

    概述

    24点问题,是一个有趣的问题。他的扩展问题(即把牌数/计算值进行更改),很可能也是一个NP-完全问题,他与subset sum problem问题有一些些类似。如果参考subset sum problem问题的解法(例如做一些动态优化解),则可以实现还比较优的解。

    不过,这一次的比赛,是要求在一条SQL里面实现,并且限制了SQL长度为10KB,所以就大大限制了实现的方式。不过最为直接的两个思路还是,“暴力的枚举”计算和“预计算结果再做哈希求解”。即便如此,在写SQL过程中,还是遇到了如下挑战需要解决:

    • 使用单条SQL进行暴力枚举的时候,如何在没有for/while等循环控制,如何遍历所有的可能性
    • 哈希数组的空间占用比较大,可能会超过10KB,如何去压缩或者减少需要构建的数组

    另外,实现过程中,可能涉及到浮点数计算、除数为零等问题的处理,也是非常容易出错的。

    另一个角度,这些,也是这道题,有趣的地方。

    “一条SQL算24点”的题目回顾

    这次的题目,与一般意义上24点略有一些不同:

    • 首先,要求一条SQL内完成;对于穷举、哈希的实现本身就有挑战了。需要对SQL比较熟悉,否则很难写出正确、高性能的SQL
    • SQL大小限制为10KB,所以,并不能简单的穷举,简单的CASE WHEN 10KB肯定是不够的
    • 4个数字,被限制为1~10,而不是13,所以搜索空间是相对来说少了一些的,让10KB以内哈希成为可能
    (more…)
  • This content is password-protected. To view it, please enter the password below.

  • 杨梅树

    ·

    酸甜的杨梅,我是很喜欢吃的。这些年来到浙江后,注意到这里的杨梅比其他地方更多一写。这也算是中国,或者说江南的一大特色吧,北方人大概是吃得少的。不过因为有“望梅止渴”的故事,杨梅在中国的知名度是非常高的。

    根据Wikipeida的信息(参考),杨梅主要分布在中国的东南方地区、日本、菲律宾、朝鲜/韩国等地。在中国,又属浙江特别多,浙江又以仙居杨梅最为有名。

    杨梅酸中带甜,非常好吃。但是,杨梅的运输是非常困难的。从树上采摘下来,最佳的食用时间也就是1~3天,再长时间由于水分的流逝,味道就没那么鲜美了。再者,因为杨梅表面非常松软,而如果运输过程稍有颠簸挤压,则非常容易压坏,影响口感,也容易变质。

    所以,实际的情况就是,杨梅的上市几乎只有一个月时间,也就是说,每年只有一个月时间,也只在中国的东南方的一些城市能够吃到最好的杨梅。

    鲁彦曾经下过一篇散文《故乡的杨梅》,是啊,对于浙江人,身在外地,对于杨梅的怀念,大概就是故乡味道的怀念吧。

    前年底,妈妈离开了我们。当时,有几天闲在家里,我就和爸爸说,来年开春,我打算在后院种一颗杨梅树。去年,我们移植了一颗小的杨梅树,大概是因为种植的时候耽搁了几天。杨梅树没能够活下来。今年,我们又移植了一颗,这次的树更大一些,种植的时候我们也更小心,也了解了很多种植的知识,希望这颗杨梅树能够活下来,过几年能够吃上自己种的杨梅树。

    对于自己,对于孩子们,也希望让故乡,多一份味道。

    2022年,团队outing,在仙居的山上摘杨梅
    后院新种的杨梅树@共青城

  • 最近,使用sysbench测试时,尝试使用参数--skip_trx=on,很快在实际的测试中就遇到了Duplicate entry的报错,详细的报错如下:

    [ 105s ] thds: 64 tps: 845.68 qps: 15226.20 (r/w/o: 11833.15/3393.04/0.00) lat (ms,95%): 82.96 err/s: 0.00 reconn/s: 0.00
    [ 108s ] thds: 64 tps: 828.65 qps: 14846.32 (r/w/o: 11547.73/3298.59/0.00) lat (ms,95%): 92.42 err/s: 0.00 reconn/s: 0.00
    [ 111s ] thds: 64 tps: 811.67 qps: 14705.36 (r/w/o: 11439.69/3265.67/0.00) lat (ms,95%): 92.42 err/s: 0.00 reconn/s: 0.00
    FATAL: mysql_drv_query() returned error 1062 (Duplicate entry '172978' for key 'sbtest4.PRIMARY') for query 'INSERT INTO sbtest4 (id, k, c, pad) V
    ALUES (172978, 743044, '85734897298-37760631172-31656179599-77290009462-94351507893-97022333300-02606364258-99231394161-86310536236-00514105136',
    '50908340877-51595671823-98046322819-52667567569-56801127593')'
    FATAL: `thread_run' function failed: /usr/share/sysbench/oltp_common.lua:488: SQL error, errno = 1062, state = '23000': Duplicate entry '172978' f
    or key 'sbtest4.PRIMARY'

    也注意到,这个错误的出现有一定的偶发性,但是高并发、长时间压测几乎一定会遇到了(在开启了--skip_trx=on参数后)。因为Sysbench没有对”Duplicate entry”该错误进行处理,测试会退出,也就无法正常完成测试。

    原因分析

    当多个线程并发时,同时没有使用--skip_trx=on,而是使用MySQL默认的auto commit模式,那么在oltp_read_write模型下则一定的概率(小概率)会出现如下的场景:

    时间线线程A线程B
    1生成随机ID X
    2生成随机ID X
    3删除 id 为 X 的记录
    delete from sbtest where id = X
    4删除 id 为 X 的记录
    delete from sbtest where id = X
    5写入 id 为 X 的记录
    insert into sbtest (id…) values ( X …)
    6写入 id 为 X 的记录
    insert into sbtest (id…) values ( X …)

    在上面的场景下,最后一步,线程B再次写入id 为 X 的记录时,则会出现冲突。

    一般来说,即便发生如上情况,也不会出现Duplicate entry的报错。但,组合一些情况,则会出现。例如,在这里,我们使用了--skip_trx=on,那么线程A的如上行为不是在一个事务中,每个操作是一个独立的事务,那么就会出现Duplicate entry报错。

    如果没有使用--skip_trx=on参数,那么在线程2尝试删除记录时,则会遇到锁等待,直到线程1的相关操作全部完成。也就不会出现报错。

    避免该错误

    在开启了–skip_trx=on之后,如果运行时间足够长,且是多线程并发,则几乎一定会遇到如上错误。可以考虑如下方案避免:

    一般来说,因为当表的记录数非常多时,遇到该类冲突的概率比较小,做如上处理并不会影响测试的“一致性”。

    function sysbench.hooks.sql_error_ignorable(err)
      if err.sql_errno == 1062 then -- ER_DUP_ENTRY
        -- do nothing
        -- con:reconnect()
        return true
      end
    end

  • This content is password-protected. To view it, please enter the password below.

  • 2024年的期待

    ·

    今天是元宵节,姑且还算是春节期间吧,做个总结和展望吧,虽然有点晚。

    • 海拉鲁大陆已经被探索的差不多了,考虑新开一个游戏系列,有什么推荐的吗?《艾尔登法环》、《博德之门 3》?
    • 考虑和家人们一起更多的探索中国、或者国外的一些地方
    • 随着大模型的流行,以及文字内容日渐不受关注,老实说,写博客的动力越来越不足了,是不是考虑把博客转换成视频呢?
    • 把云数据库性能测试持续做下去,2024年计划再测三次
    • 希望把体重能够控制在130以内,这个目标非常不容易
    • 拍更多的照片,家人们的,以及看到的风景的
    • 祝愿TH000早日康复,挺喜欢看他的直播
    • 还有几部电视剧/电影,也计划看掉:
      • 三体(Netflix)、
      • 庆余年2(这是一个“爽”剧)、
      • 真探第四季(HBO)
      • 猩球崛起4:新世界 Kingdom of the Planet of the Apes (2024),虽然前面三部,一部比一部差…
      • 变形金刚:初代 Transformers One
    • 和同事们一起把产品做得更好,同时也探索出可持续的、高效的商业模式