一、本篇直接进入主题吧~

1.MySQL赋权限有几个维度?分别是什么?

  • 4个,全局、DB、表、列。

2.全局权限的语法是什么?原理是什么?生效时机是什么时候?

  • grant all privileges on *.* to 'ua'@'%' with grant option;
  • 1)磁盘上,将 mysql.user 表里,用户’ua’@’%'这一行的所有表示权限的字段的值都修改为‘Y’;2)内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 值(权限位)修改为二进制的“全 1”。
  • 命令完成后即时生效,接下来新创建的连接会使用新的权限。但是,对于一个已经存在的连接,它的全局权限不受 grant 命令的影响。

3.db权限的语法是什么?原理是什么?生效时机是什么时候?

  • grant all privileges on db1.* to 'ua'@'%' with grant option;
  • 1)磁盘上,往 mysql.db 表中插入了一行记录,所有权限位字段设置为“Y”;2)内存里,增加一个对象到数组 acl_dbs 中,这个对象的权限位为“全 1”。
  • acl_dbs 是一个全局数组,所有线程判断 db 权限都用这个数组,这样 revoke 操作马上就会影响到当前session。

4.表和列权限的差异和特殊点是什么?

  • 差异:表权限定义存放在表 mysql.tables_priv 中,列权限定义存放在表 mysql.columns_priv 中。这两类权限,组合起来存放在内存的 hash 结构 column_priv_hash 中。
  • 共同:跟 db 权限类似,这两个权限每次 grant 的时候都会修改数据表,也会同步修改内存中的 hash 结构。因此,对这两类权限的操作,也会马上影响到已经存在的连接。

5.flush privileges 使用场景?举例?

  • 当数据表中的权限数据跟内存中的权限数据不一致的时候,flush privileges 语句可以用来重建内存数据,达到一致状态
  • delete from mysql.user where user = 'ua'; 直接删除,会导致磁盘跟内存不一致。drop命令同时操作磁盘和内存

二、课后评论

6.MySQL常用命令(虽然很不想记,但是不记又不行)

  • \G 行转列并发送给 mysql server
  • \g 等同于 ;
  • \! 执行系统命令
  • \q exit
  • \c 清除当前SQL(不执行)
  • \s mysql status 信息

7.MySQL 表设计时列表顺序对MySQL性能的影响大吗?对表的列顺序有什么建议吗?

  • 不大
  • 每次如果要加列都加到最后一列,主从同步最后一列没有值也没关系 ,如果插入中间 会sql报错