MySQL笔记

  • 1、事务的理解
    如果不显式的开启一个事务那么每一个查询都被当作一个事务执行(事务默认自动提交),如果不开启事务自动提交,那么所有查询都会在一个事务中
    所以可以理解为对数据update 操作的时候是加了行锁的

  • 2、行锁理解
    select * from table where id<10 and id>2 for update
    通过索引先扫描过滤数据,扫描了多少数据就给哪些行加行锁

  • 3、执行计划using where理解
    服务器层使用了where条件进行过滤,但是这个条件不是索引

  • 4、行锁隐式锁定/显式锁定

    • 显示锁定
      select * from table lock in share mode;
      select * from table for update;
    • 隐式锁定
      开启事务之后根据隔离级别随时可能锁定,commit/rollback 解锁
  • 5、 MySQL执行update 操作加锁情况分析
    示例sql:update tb_user set phone=11 where name=”c1″

    • 1.没有索引
      运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name=”c1″;修改,先别commit事务。
      再开一个窗口,直接运行命令:update tb_user set phone=22 where name=“c2”;会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。
    • 2.给name字段加索引
      然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name=”c1″;先不提交
      然后另一个运行update tb_user set phone=22 where name=”c2″;发现命令不会卡住,说明没有锁表
      但是如果另一个也是update tb_user set phone=22 where name=”c1″;更新同一行,说明是锁行了
      这里是关闭了事务自动提交,不关闭的原理也是一样的,这里是为了展示。
  • 6、单个update执行是否是事务

  • 7、关于MySQL事务自动提交

    • 值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。
    • 值为 1 和值为 ON:开启事务自动提交。如果开启自动提交,则每执行一条 SQL 语句,事务都会提交一次。
      使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,直到使用 COMMIT 或 ROLLBACK 结束事务。之后,自动提交模式会恢复到之前的状态
  • 8、INT(1)和INT(8)占用空间大小一样吗?
    一样,括号里的数只是规定了MySQL的一些交互工具用来显示字符的个数。而实际占用空间是和数据类型有关的TINYINT 1byte 即 8bit SMALLINT 2byte即16bit ,INT 4byte 32bit

  • 9、优化DECIMAL类型存储
    假设存储数据要精确到万分之一,可以将数据乘以10000,存储到bigint里,这样可以避免DECIMAL的精度计算

  • 10、 读锁(共享锁)写锁(排他锁)
    当前事务对数据加了读锁之后,别的事务可以继续加读锁,但是不能加写锁,这也就可以避免读取数据的时候会被其它事务修改,避免导致不重复读问题。
    当前事务加了写锁,别的事务既不能加共享锁也不能加写锁,所以也就避免了脏写和脏读的问题。(但是可以快照读)

你可能感兴趣的:(MySQL笔记)