目录
本篇是系列性,由浅入深,主要是为了本人日后回看时再学习,如果道友对Mysql也是零基础的话,强烈建议从头开始看
Mysql的用户和权限:
创建用户账号:
CREATE USER 'username'@'host' IDENTIFIED BY 'your_password';
删除用户账号:
DROP USER 'username'@'host';
查看用户获得的权限:
SHOW GRANTS FOR 'username'@'host';
Mysql的权限级别:
库级别
表级别
字段级别
管理类
程序类
管理类权限:
CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS
程序类权限:
FUNCTION
PROCEDURE
TRIGGER
CREATE,ALTER,DROP,EXCUTE
Storage routine:存储例程
storage procedure
storage function
库和表级别权限:对TABLE or DATABASE 有效
ALTER
ALTER ROUTINE
CREATE
CREATE ROUTINE
CREATE VIEW
DROP
EXECUTE
INDEX
GRANT OPTION: 是否可以转授权限的权限;不建议使用,很难回收权限
SHOW VIEW
数据操作(表级别):
SELECT
INSERT
UPDATE
DELETE
字段级别:
SELECT(col1,...)
UPDATE(col1,...)
INSERT(col1,...)
所有权限:
ALL [PRIVILEGES]
用户账号:
'USERNAME'@'HOST'
@'HOST'
主机名
IP地址或Network;
通配符:
%,_: 172.16.1.%
创建用户:CREAT USER
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
查看用户获得的授权:SHOW GRANTS FOR
SHOW GRANTS FOR 'USERNAME'@'HOST'
用户重命名:RENAME USER
RENAME USER old_user_name TO new_user_name
删除用户:DROP USER 'USERNAME'@'HOST'
修改密码:
1) SET PASSWORD FOR
2) UPDATE mysql.user SET password=PASSWORD('your_password') WHERE clause;
3) mysqladmin password
mysqladmin [OPTIONS] command command....
-u, -h, -p,
忘记管理员密码的解决方法:
1) 启动mysqld进程时,为其使用:--skip-grant-tables --skip-networking
2) 使用UPDATE命令修改管理员密码;
3) 关闭mysqld进程,移除上面两个选项,重启mysqld;
/etc/init.d/mysql --> 重启 --> mysql --> UPDATE --> 重启
元数据数据库:mysql
mysql中的授权相关的表:
db、host、user
columns_priv、tables_priv, procs_priv
授权与取消授权:GRANT, REVOKE
授权
GRANT priv1, priv2, ... ON [TABLE|FUNCTION|PROCEDURE] db_name.tb_name|routine TO 'username'@'host' [IDENTIFIED BY 'password'] [REQUIRE ssl_option] [WITH with_option]
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
取消
REVOKE priv1,priv2,... ON [TABLE|FUNCTION|PROCEDURE] db_name.tb_name|routine FROM 'username'@'host',...;
练习:授权test用户通过任意主机连接当前mysqld,但每秒钟最大查询次数不得超过5次;此账户的同时连接次数不得超过3次;
Mysql cache
如何判断是否命中:
通过查询语句的哈希值判断;哈希值考虑的因素包括
查询本身,要查询的数据库,客户端使用协议版本,。。。
查询语句任何字符上的不同,都会导致缓存不能命中;
SELECT --> QUERY CACHE --> PARSER --> OPTIMIZER --> EXECUTING ENGINE --> STORAGE ENGINE
缓存:hit(命中),miss(未命中)
Key-value
衡量缓存的有效性:命中率,hit/(hit+miss)
次数;
query_cache_type
ON,OFF,DEMAND
SQL_CACHE | SQL_NO_CACHE
QUERY CACHE:
Key:查询语句的hash码;
Value:查询语句的执行结果;
什么样的语句不会缓存?
查询语句中有不确定数据时不会缓存;
一般来讲,如果查询中包含用户自定义的函数(UDF)、存储函数、用户变量、临时表、mysql库中系统表、包含列表权限的表,有着不确定值的函数(Now())或者任何包含权限信息表,都不会缓存;
缓存什么场景下比较有效?
对于存在需要大量资源的查询非常适合启用缓存;
与缓存功能相关的服务器变量:
Query_cache_limit:mysql能够缓存的最大查询结果;如果某查询的结果大于此值,则不会被缓存;
对于有着较大结果的查询语句,建议在SELECT中使用SQL_NO_CACHE
Query_cache_min_res_unit:查询缓存中分配内存的最小单位
较小值会减少浪费,但会导致更频繁的内存分配操作;
较大值会带来浪费,会导致碎片过多。
计算公式:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache
Query_cache_size:查询缓存的总体可用空间;单位是字节,其必须是1024的倍数;
Query_cache_wlock_incalidate:当其他会话锁定此次查询用到的资源时,是否能再从缓存中返回数据;默认OFF表示能返回数据
query_cache_type:ON OFF DEMAED
与缓存相关的状态变量:
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