MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存

mysql权限级别:

  • 库级别
  • 表级别
  • 字段级别
  • 管理类
  • 程序类

  • 管理类
    create temporary tables
    create user
    file
    show databases
    reload
    shutdown
    replication slave
    replication client
    lock tables
    process

  • 程序类
    function
    procedure
    trigger
    create, alter, drop, excute

  • 库和表级别
    alter
    create
    create view
    drop
    index
    grant option

  • 数据操作
    select
    insert
    delete
    update

  • 字段级别
    select(col1,col2,...)
    update(col1,col2,...)
    insert(col1,col2,...)

  • 所有
    all privilege, all

这些权限都是保存在数据的元数据表'mysql'库中

  • 授权表
    • db,host,user
    • columns_priv, tables_priv, procs_priv, proxies_priv

用户帐号:
'username'@'host'

创建用户:create user 'user'@'host' [identity by 'password']

查看用户权限: show grants for 'username'@'host'

用户重命名:rename user old to new

删除用户: drop user 'username'@'host'

修改密码:

1. set password for
2. update mysql.user set password=PASSWORD('password')
3. mysqladmin password

忘记管理员密码:

  1. 启动mysqld时,为其使用--skip-grant-tables --skip-networking
  2. 使用update命令修改管理员密码
  3. 关闭mysqld进程,移除上述两个权限,重启mysqld

授权:

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

GRANT PROXY ON user_specification
    TO user_specification [, user_specification] ...
    [WITH GRANT OPTION]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

user_specification:
    user
    [
        IDENTIFIED BY [PASSWORD] 'password'
      | IDENTIFIED WITH auth_plugin [AS 'auth_string']
    ]

ssl_option:
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

with_option:
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

取消授权

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...

REVOKE PROXY ON user
    FROM user [, user] ...

练习

授权test用户通过任意主机连接到当前的mysqld,但每秒钟最大查询次数不超过5次:此账户同时连接次数不得超过3次.

查询缓存

如何判断是否命中:

  • 通过查询语句的哈希值来判断,哈希值考虑的因素包括

    • 查询本身\要查询的数据库\客户端使用的协议版本
    • 查询语句任何字符上的不同,都会导致缓存不能命中
  • 那些查询可能不会被缓存

    • 查询钟包含UDF\存储函数\用户自定义变量\临时表\mysql库钟的是同表\包含列级权限的表\有着不确定的函数(now())
  • 查询缓存相关的服务器变量:

    • query_cache_min_res_unit: MySQL能够缓存的最大查询结果;如果某查询大于此值,则不会被缓存;
    • query_cache_limit: 查询缓存钟分配内存的最小单位;
      计算公式:(query_cache_size-Qcache_free_memory)/ Qcache_queries_in_cache
    • query_cache_size: 查询缓存的总体可用空间,必须为1024的整数倍
    • query_cache_type:
    • query_cache_wlock_invalidate: 当其它会话锁定此次查询用到的资源时,是否不能再从缓存中返回数据(默认为false)
  • 与缓存相关的状态变量

SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16759656 |
| Qcache_hits             | 16       |
| Qcache_inserts          | 71       |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 57       |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+

缓存命中率计算公式:Qcache_hits/Com_select

衡量缓存是否足够有效的另一种思路:Qcache_hits/Qcache_inserts,如果此比值大于3:1, 说明缓存也是有效的;如果高于10:1,相当理想;

缓存优化的思路:
1、批量写入比单次写入对缓存的影响要小得多;
2、缓存空间不宜过大,大量缓存的同时失效会导致MySQL假死;
3、必要时,使用SQL_CACHE或SQL_NO_CACHE手动控制缓存;
4、对写密集型的应用场景,禁用缓存反而能提高性能;

碎片整理:FLUSH QUERY_CACHE
清空缓存:RESET QUERY_CACHE

MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存_第1张图片
image.png
graph LR
Start[开始] --> A{是否命中}
A -->|是| End[结束]
A --> |否| B{大部分查询都不是可缓存的?}
B --> |是| C{query_cache_limit是够大么?}
C --> |是| End
C --> |否| E[增加query_cache_limit] 
E --> Start
B --> |否| F{发生了很多验证工作?}
F --> |是| G{缓存被碎片化了么?}
G --> |是| G1[减少query_cache_min_res_unit或者使用FLUSH QUERY CACHE命令减少碎片]
G --> |否| G2{有很多因为内存过低而发生的修整工作?}
G2 --> |是| GG1[增加queru_cache_size] 
GG1 --> Start
G2 --> |否| GG2{有很多新语句么?}
GG2 --> |是| End
GG2 --> |否| GGG[有其他的东西配置错了]

F --> |否| F1{缓存已经启动了吗?}
F1 --> |否| FF1[启动缓存]
FF1 --> Start
FF1 --> |是| End

你可能感兴趣的:(MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存)