一、MySQL的并发控制

1、MySQL的并发控制在 服务器层和存储引擎层完成

锁:lock

读锁:共享锁,可以几个用户同事读取,但不能写

写锁:独占锁,

锁粒度:锁表时锁表的范围(比如一个用户读前三行,一个用户写入最后一行)

表级锁:innodb表级锁

行级锁:myisa行级锁(锁控制复杂)

死锁:A请求B,B请求A (自己能协商解锁)

锁分类:

隐式锁:由存储引擎自动完成

显式锁:用户可手动施加锁,表级锁

手动加锁:服务器级别实现

LOCK TABLES tb1 {READ|WRITE},……

           UNLOCK TABLES;释放锁

例:>use hellodb;

>LOCK TABLES students READ;

FLUSH TABLES WITH READ LOCK; 关闭表并全局执行读锁

UNLOCK TABLES;

InnoDB存储引擎也支持另外一种显式锁(只锁定挑选的行)

SELECT... LOCK IN SHARE MODE;

SELECT...FOR UPDATE;

2、事务:ACID

一个事务就是一个执行单元:多个sql语句,要么都执行,要么都不执行。

事务:提交,回滚

A:atomicity,原子性

C:consistency,一致性

I:isolation,隔离性

隔离级别:4个级别

D:durability,持久性

事务的隔离级别:

READ-UNCOMMITTED(读未提交):最低隔离级别,会产生“脏读”;

READ-COMMTTED(读提交):“不可重复读”

REPEATABLE-READ(可重读):“幻读”

SERIALIZABILE(可串行化):使用加锁读

SELECT @@global.tx_isolation;

+-----------------------+

| @@global.tx_isolation |

+-----------------------+

| REPEATABLE-READ       |

+-----------------------+

启动事务:

START TRANSACTION

提交事务:COMMIT

回滚事务:ROLLBACK

SAVEPOINT

SAVEPOINT identifier

ROLLBACK [WORK] TO [SAVEPOINT] identifier

RELEASE SAVEPOINT identifier

MySQL的自动提交功能:

SELECT @@GLOBAL.autocommit;

+---------------------+

| @@GLOBAL.autocommit |

+---------------------+

|                   1 |

+---------------------+

MVCC: 通过保存数据在某个时间的快照实现。无论事务执行多长时间,其看到的数据都是一致的。

MVCC仅在第二、第三隔离级别下有效;

事务日志:将随机I/O转换为顺序I/O,以提升事务操作效率;事务日志也称为Write-Ahead Logging

总结:锁、事务、MVCC、事务日志

二、MySQL存储引擎介绍

三、MySQL用户和权限管理

1、最小化权限集合

用户@主机:表示此用户帐号可从@HOST范围内的某主机对此MySQL建立连接;

@HOST: 表示客户端

%:任意长度的任意字符串

_:单个字符

172.16.0.0/16, 172.16.%.%

创建用户账号:

CREATE USER 'username'@'host' IDENTIFIED BY 'your_password', ...

如:CREATE USER tuser@localhost IDENTIFIED BY 'mageedu';

删除用户账号:

DRP USER 'username'@'host';

查看用户获得的权限:

SHOW GRANTS FOR 'username'@'host';

如:SHOW GRANTS FOR tuser@localhost; 仅能链入数据库使用其基本功能。

2、MySQL的权限类别:库级别、表级别、字段级别、管理类、程序类

管理类:

CREATE TEMPORARY TABLES :创建临时表

CREATE USER:创建用户

FILE:保存文件,把数据库数据保存成文件

SUPER:不便归类的

SHOW DATABASES:显示数据库

RELOAD:重置日志及缓存相关

SHUTDOWN:关闭MySQL服务

REPLICATION SLAVE:复制架构中的从节点

REPLICATION CLIENT:向主服务器发起链接请求,获取主服务器状态信息权限

LOCK TABLES:施加锁的权限

PROCESS:进程相关权限

storage routine: 存储例程

storage procedure

storage function

库和表级别:(DDL语句)

ALTER:修改库或表

ALTER ROUTINE :存储例程

CREATE

CREATE ROUTINE

CREATE VIEW :创建视图

DROP :删除表、库、视图

EXECUTE

INDEX :创建或删除索引

GRANT OPTION: 是否可以转授权限的权限;

SHOW VIEW :显示视图

数据操作(表级别--DML语句):

SELECT 查询数据权限

INSERT 插入数据权限

UPDATE 修改数据权限

DELETE 删除数据权限

字段级别:

SELECT(col1,...)

UPDATE(col1,...)

INSERT(col1,...)

所有权限:

ALL [PRIVILEGES]

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]

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',...;

例如:GRANT SELECT ON hellodb.students TO 'tuser'@'localhost';

show databases; use hellodb, show tables;select * from students;

insert into students (name,age,gender) values('zhang',22,'f')

练习:

1、授予testuser能够通过172.16.0.0/16网络内的任意主机访问当前mysql服务器的权限

2、让此用户能够创建及删除testdb数据库,及库中的表;

3、让此用户能够在testdb库中的t1表中执行查询、删除、更新和插入操作;

4、让此用户能够在testdb库上执行创建和删除索引;

5、让此用户能够在testdb.t2表上查询id和name字段,并允许其将此权限转授予其他用户;

GRANT SELECT(id,name) ON testdb.t2 TO testuser@'172.16.%.%' WITH GRANT OPTION;

3、用户重命名:

RENAME USER old_user TO new_user;

四、MySQL查询缓存管理及数据类型选择

缓存:hit(命中),miss(未命中):衡量缓存的有效性:命中率, hit/(hit+miss)
                    query_cache_type
                          on、off、demand(手动指明该语句是否缓存sql_cache | sql_no_cache)

query cache:
                      key:查询语句的hash码
                      value:查询语句的执行结果

什么样的语句不会缓存?
                      查询语句中有不确定数据时不会缓存。
                      查询中包含用户自定义的函数、存储函数、用户变量、临时表、包含权限的语句不会缓存。

缓存什么场景下会比较有效?
                     需要消耗大量资源的查询,缓存比较有效

与缓存功能相关的服务器变量:

SHOW GLOBAL VARIABLES LIKE 'query_cache%';显示缓存相关变量

+------------------------------+----------+

| Variable_name                | Value    |

+------------------------------+----------+

| query_cache_limit            | 1048576  |

| query_cache_min_res_unit     | 4096     |

| query_cache_size             | 16777216 |

| query_cache_strip_comments   | OFF      |

| query_cache_type             | ON       |

| query_cache_wlock_invalidate | OFF      |

+------------------------------+----------+

query_cache_limit: 单条语句查询结果大于该值不与缓存,可修改变量值。
                          query_cache_min_res_unit:查询缓存时内存中分配最小单位。
                          query_cache_size:缓存最大空间,该数组必须为1024倍数,0为没有开启缓存。
                          query_cache_type:是否开启手动缓存功能
                          query_cache_wlock_invalidate:

与缓存相关的状态变量:

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        |

+-------------------------+----------+

show global status like 'Qcache%';:为mysql运行过程中的统计数据不能修改。
                     Qcache_free_blocks :查询缓存中空闲块
                     Qcache_free_memory :所有未分配的空间
                     Qcache_hits:查询命中次数
                     Qcache_inserts:向缓存中插入的次数
                     Qcache_lowmem_prunes :缓存满后清除缓存中数据次数
                     Qcache_not_cached:没能被缓存的次数
                     Qcache_queries_in_cache:还留在缓存中的数据,0表示都流失了。
                     Qcache_total_blocks:共分配缓存中的块
                 show global status like 'Com_select';:现实共执行select的次数

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

碎片整理:flush query cache;
             清空缓存:reset query cache;

转载于:https://blog.51cto.com/liwenjia/1827523

第三十一天 MySQL并发控制、存储引擎介绍、用户权限管理、缓存管理和数据类型选择...相关推荐

  1. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

    一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...

  2. [存储引擎] MySQL的存储引擎介绍

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

  3. MySQL 数据库存储引擎介绍

    文章目录 一.存储引擎概念介绍 二.MyISAM 存储引擎 1. MyISAM 简介 2. MyISAM 表支持 3 种不同的存储格式 (1) 静态(固定长度)表 (2) 动态表 (3) 压缩表 3. ...

  4. mysql 时序 存储引擎_MySQL常见的三种存储引擎

    原文链接:https://www.cnblogs.com/yuxiuyan/p/6511837.html 简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点 ...

  5. mysql innodb 存储引擎

    --MySQL 结构有两部分组成 1.MySQL server 层 2.存储引擎层 --注:到 存储引擎层之前都属于 MySQL server 层 MySQL 5.1到 5.7 ,大版本 没有变化 , ...

  6. MySQL数据库03(MySQL的存储引擎 DML语句 父子查询 )

    一.1.MySQL的存储引擎 储存引擎的类型:MyISAM.InnoDB. Memory.CSV等九种 MyiSAM和InnoDB类型主要区别 名称 InnoDB MyISAM 事务处理 支持 不支持 ...

  7. MySQL之存储引擎

    文章目录 MySQL知识总结之(存储引擎层) 1.四种存储引擎 2.InnoDB存储引擎 2.1介绍 2.2优缺点 2.3表空间文件 2.4查看表空间文件 2.5查看参数开关 2.6特点 3.MyIS ...

  8. mysql的存储引擎详解_Mysql存储引擎详解

    存储引擎的介绍 关系型数据库表是用来存储和组织信息的数据结构,可以将表理解为由行和列组成的表格. 由于表的类型不同,我们在实际开发过程中,就有可能需要各种各样的表,不同的表就意味着存储不同类型的数据, ...

  9. Mysql数据库存储引擎--转

    原文地址:http://pangge.blog.51cto.com/6013757/1303893 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是My ...

  10. mysql 数据表操作 存储引擎介绍

    一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...

最新文章

  1. 通过C#实现集合类纵览.NET Collections及相关技术
  2. WKWebView免登陆,配置cookie
  3. 2021-春季学习-智能车技术创新与实践-Lesson2
  4. 随手记录自动化常用的一些事情
  5. How to resolve empty table CRMATAB issue in ERP gt_crmtab[]
  6. 关于控件postback 后viewstate加载失败的问题
  7. 乐玩自动化测试模块_自动化测试模型(一)自动化测试模型介绍
  8. 马斯克:全力支持狗狗币主要持有者出售货币 持仓太集中是问题
  9. Jmeter系列之no-gui模式
  10. python3.3psutil模块安装_详解Python3.6安装psutil模块和功能简介
  11. node mysql json_Node.js JSON模块用法实例分析
  12. java代码程序流程思想_控制执行流程——java编程思想第4章
  13. SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘staff_info.depart_id‘ in ‘where clause‘
  14. Spring Boot入门(7)-单元测试
  15. 简单的小愿望,就这么难实现
  16. [UWP]如何实现UWP平台最佳图片裁剪控件
  17. OpenSSL密码库算法笔记——第4章 模指数运算
  18. selenium小白学习笔记(6) - 使用parameterized参数化
  19. [周鸿祎] 与其苟且活着,不如奋起抗争
  20. 我的Effective C++读书笔记

热门文章

  1. 三十而立,从零开始学ios开发(八):Autorotation and Autosizing
  2. Jquery 使用技巧总结
  3. 使用PL/SQL程序输出1~13中所有不是3的倍数的整数数值
  4. 国外高手又一力作,CAML Builder
  5. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)
  6. Codeforces Round 253 (Div. 2)
  7. $(...).modal is not a function
  8. 7.Django|分页器
  9. 咏南IOCP REST中间件
  10. 118 Python程序中的线程操作-守护线程