一、本篇直接进入主题吧~
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报错