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 成为解析树的结构二叉树。


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

发布了19 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011151452/article/details/105195770