分类 cmd 下的文章

SQLSTATE[40001]: senalization failure 1213 deadlock found when trying to get lock, try restarting transaction (SQL: UPDATE ...)

网上找的答案
https://www.cnblogs.com/doseoer/p/10325596.html

官方文档
https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks-handling.html


SQLSTATE[HY000] [2002] Connection refused

前端反馈测服偶尔出现这个错误
参考了网上很多答案, 很多人说把配置文件里面的localhost改为127.0.0.1就可以了, 也许吧

针对delete操作, 常常会慢的严重, 明明查询出来需要删除的记录才70多条, 执行一次都得1分多钟

需求, 下单未支付同样的信息的, 删除除了最大的一条记录的信息(这边假设单人下单不超过2次相同的下单信息的, 我实际的操作是多执行几次就够了)
  • 原sql
delete from course_orders
where 
pid=1 
AND state=1
AND created_at<date_sub(now(),interval 7 DAY)
AND id IN (
    SELECT max_order_id FROM (
        SELECT use_uid,course_id,COUNT(1) AS num,MAX(order_id) AS max_order_id FROM `course_order_items`
        WHERE 
        pid=1 
        AND state=0
        AND created_at>'2020-01-01'
        GROUP BY use_uid,course_id
    ) a
    WHERE num>1
)

共 73 行受到影响

执行耗时   : 59.794 sec
传送时间   : 0.001 sec
总耗时      : 59.796 sec
  • 优化后
delete co from course_orders co inner join (
    SELECT max_order_id FROM (
        SELECT use_uid,course_id,COUNT(1) AS num,MAX(order_id) AS max_order_id FROM `course_order_items`
        WHERE 
        pid=1 
        AND state=0
        AND created_at>'2020-01-01'
        GROUP BY use_uid,course_id
    ) a
    WHERE num>1
) bb on pid=1 
AND state=1
AND created_at<date_sub(now(),interval 7 DAY)
AND co.id=bb.max_order_id

执行结果
共 73 行受到影响

执行耗时   : 0.066 sec
传送时间   : 0.008 sec
总耗时      : 0.075 sec

redis的一些命令和执行的返回值

方法含义示例命令返回值
select选择dbselect 0"OK"
字符串
SET字符串set string 888"OK"
__set string 888"OK"
GET字符串get string"888"
__get string1null
哈希
hset设置hash值hset aa abc 123"1"
__hset aa abcd 123"ERR wrong number of arguments for 'hset' command"
_warning注意, hash里面的value是唯一值, 不可相同, 其他hashkey的值如果和已有的相同则报错
__hset aa abc 1234"0"
_warning注意, hash里面key的value变化返回为0
集合
sadd集合SADD saddkey redis"1"
__SADD saddkey redis"0"
_warning这个里面保存的是唯一值的集合
有序集合
zadd有序集合ZADD zset 111 a1"1"
__ZADD zset 11 a1"ERR wrong number of arguments for 'zadd' command"
_warning注意, 有序集合里面的值不能通过该发放修改
__ZADD zset 111 a2"1"
__ZADD zset 111 a2"0"
ZREM移除有序集合的的setkeyZREM zset a1"1"
__ZREM zset a1"0"

方法说明方法返回值
json_search按给定字符串关键字搜索json,返回匹配的路径json_search('["10","2","1"]','all','1')"$[2]"
--查询路径2json_search('{"a":"123","b":{"c":"d","e":"f"}}','all','f')"$.b.e"
json_merge合并json数组或对象json_merge('["10","2"]','["10","9"]')["10", "2", "10", "9"]
JSON_MERGE_PRESERVE合并json数组或对象,代替json_merge用途JSON_MERGE_PRESERVE ('["10","2"]','["10","9"]')["10", "2", "10", "9"]
json_remove删除json数据json_remove('{"a":"123","b":"123"}','$.a'){"b": "123"}
--删除数组中值json_remove('["10","2","1","6"]','$[2]')["10", "2", "6"]
--删除当数组中存在某一个值时执行删除(注意, 当没有该值时, 这个查询的返回值为null)json_remove('["10","2","1","6"]',json_unquote(json_search('["10","2","1","6"]','all','1')))["10", "2", "6"]
--删除当数组中存在某一个值时执行删除(安全的操作, 只要数据量不大于99999就没问题)json_remove('["10","2","1","6"]',IFNULL(json_unquote(json_search('["10","2","1","6"]','all','11')),'$[9999999]'))["10", "2", "1", "6"]
json_keys提取json中的键值为json数组json_keys('{"a":"123","b":{"c":"d","e":"f"}}')["a", "b"]
json_length返回json的长度json_length('["10","2","10","9"]')4
--如果为复杂的对象结构, 这个长度依旧为根部key的个数json_length('{"a":"123","b":{"c":"d","e":"f"}}')2
json_unquote去除json字符串的引号,将值转成string类型
json_extract提取json值json_extract(openid,REPLACE(json_unquote(json_search(openid,'all','2')),'app_id','openid'))"oKTQ41OqjJ848_SPe7wbTZO9RmOE"openid 字段的数据包 '[{"app_id": "1", "openid": "oromp5ZEhkLz1BXELF-cxyqap-uw"}, {"app_id": "2", "openid": "oKTQ41OqjJ848_SPe7wbTZO9RmOE"}]'
json_replace替换值(只替换已经存在的旧值)实际测试如果值不存在, 并不会导致原有数据丢失
json_set只要目标值不为null,不为数组即可设置 json_set(data,"$.address","Guangzhou")

正常的key查询哪些文档大家都能用, 但是如果key是 abc:de-fg 这样的值呢, 那么文档中那些办法无法实现查询了

尝试了好久, 终于找到了对应的解决办法

非法键值查询办法

比如demo为
json_data
{"abc:de-fg": "aa"}
那么取出这个值的办法为 json_data->'$."abc:de-fg"'
注意, 只能里面使用双引号的写法

JSON内的键值是否为null的判断方法

json_data
{"abc:de-fg": "aa","b":null}

// 判断里面的值等于null的判断方式
json_data->'$.b'=CAST('null' AS json)