Mysql如何解决实际项目中问题,以及原理?

 

1.session 1:select id = 1 and version=1 ,update count=count-1 where id =1 and version=1  session 2:select id = 1 and version=1 ,update count=count-1 where id =1 and version=1    session2里面的version变成了2

mvccs是乐观锁的一种实现方式,这种不是最好哦的解决办法。

实际上  秒杀中出现超卖问题可以用乐观锁mvcc,悲观锁,redis队列都可以解决。

排他锁,共享锁等等就是悲观锁,是一种思想,表级锁,行级锁,共享锁,排他锁有实际操作。

innodb中 where条件如果不是用索引加锁,就会从行级锁(bewteen)升级成表锁。

where  id>1 属于区间,也就是间隙还是属于行锁。
行级锁不会升级为页级锁。

数据库大体结构:/tmp/mysql.sock 【提供类型接口api】给php,java,python等。
连接层包括:[api接口]和【sql层】(解析sq语句,选择最优执行方案l)->【储存引起】(比如innodb,myisam)

提问环节,
在表设计的时候加version【字段】,先来后到 

soket[提供链接的,ip+端口?]

死锁是交叉锁。同一条数据的不同用户session的加锁,是不会出现死锁的。但是有可能会出现脏读。

 

Mysql结构与执行

mysql.sock 会出现丢失的情况。怎么解决这种情况?
1重启mysql服务,重新配置。
2,重新复制一份/在linux:/tmp/mysql.sock

pdo连接方式与mysqli连接是不一样的。
pdo 对于sql注入会有保障

存储引擎就是用户记录的信息。innodb和myisam

mysql 服务层才是最核心的。连接/线程 =>连接层:

最大连接数 show variable like '%max_count%'
如果max_connections=100 ,If有1000个连接。可能有些连接有短暂的延迟,但是不会出现阻塞。
【这个参数随便设置,但是受制于机器的物理连接能力啊】越大对于我们IO消耗越多。

短链接和场链接还是有区别的。

如果一个请求完成有可能关闭也有可能进入睡眠状态。当一定时间内没有重新开始。sleep就会释放掉。
show processlist ;都能看到state
如果sleep 就是睡眠状态。线程是睡觉状态。
不会太消耗内存资源。如果进程关了之后,重新开,sleep线程就都没有了。

到达sql 层之后
1,需要先判断SQL语句接口->判断sql类型如下,有query dml【update,delete,insert】ddl【alter 修改表,主从复制rep,status状态】
2,如果是query 类型,判断是否开启查询缓存。如果能命中查询缓存。就返回数据
3,如果没有命中缓存的情况。解析器,会把握我们的SQL解析成token(令牌),会吧执行的SQL每一个符号分解成令牌。

语法解析器:根据得到的令牌进行组装成对应 解析数据结构【树状结构】
sql 中关键词会成为对应的方法。
主要是对于where条件的。不会对于整条语句的。eg: id<10  where *...and id <10 and 成为解析树的结构二叉树。


解析树状->会进去优化器【根据我们得到的解析树】
过滤没有用的查询,常量表达式 预算成常量值
对查询结构进行调整。分析索引信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值