Linux初学者学习笔记

20171110 MySQL进阶(一)

2017-11-12  本文已影响15人  哈喽别样
  • 数据库基本概念回顾
  • 数据库的并发控制:锁
  • MySQL的事务设置
  • MySQL的索引设置
  • MySQL的用户和权限管理

一、数据库基本概念回顾

(一)数据库的分类

(1)关系型数据库:RDBMS
(2)非关系型数据库:No-SQL DBMS

(二)MySQL的基本概念

(1)MySQL的三个分支
(2)MySQL的存储引擎

二、数据库的并发控制:锁

(一)锁类型 :

读锁:共享锁,可被多个读操作共享
写锁:排它锁,独占锁

(二)锁粒度:

表锁:在表级别施加锁,并发性较低
行锁:在行级别施加锁,并发性较高;维持锁状态的成本较大

(三)锁策略:在锁粒度及数据安全性之间寻求一种平衡机制

存储引擎:存储引擎自行决定锁级别以及何时施加或释放锁
MySQL Server:表级别,可自行决定,也允许显式请求

(四)锁类别:

显式锁:用户手动请求的锁
隐式锁:存储引擎自行根据需要施加的锁

(五)实验1:读锁、写锁的区别

  1. 读锁允许其他进程对表进行读操作,不允许写操作;
    写锁不允许其他进程对表进行读写操作
  2. SQL语言的运行时间除了与复杂性有关外,还受数据库所处的环境影响(例如大量写操作的环境下,很难迅速通过FLUSH命令添加读锁)

三、MySQL的事务设置

(一)事务日志的配置项:

innodb_log_files_in_group
innodb_log_group_home_dir
innodb_log_file_size
innodb_mirrored_log_groups

(二)ACID测试:

A:AUTOMICITY,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
C:CONSISTENCY,一致性;数据库总是应该从一个一致性状态转为另一个一致性状态
I:ISOLATION,隔离性;一个事务所做出的操作在提交之前,是否能为其它事务可见;出于保证并发操作之目的,隔离有多种级别
D:DURABILITY,持久性;事务一旦提交,其所做出的修改会永久保存

(三)控制事务逻辑:

(四)实验2:手动控制事务

(五)实验3:在实验2的基础上,在一个事务中建立多个保存点,分别恢复

START TRANSACTION;
DELETE FROM students WHERE NAME='Frank';
SELECT * FROM students;
SAVEPOINT test1;
UPDATE students SET AGE=22 WHERE ID=2;
SAVEPOINT test2;
SELECT * FROM students;
DELETE FROM students WHERE NAME='Alice';
SELECT * FROM students;
ROLLBACK TO test2;
SELECT * FROM students;
ROLLBACK TO test1;
SELECT * FROM students;
ROLLBACK;
SELECT * FROM students;
COMMIT;

(六)事务隔离:

(七)实验4:区分四级事务隔离

四、MySQL的索引设置

(一)索引的基本概念:

(二)索引的类型:

(1)B+ TREE索引:

顺序存储,每一个叶子结点到根结点的距离相同;MySQL采用左前缀索引,适合于范围类型的数据查询

(2)Hash索引:

基于哈希表实现,特别适用于值的精确匹配查询;

(三)高性能索引策略:

(四)EXPLAIN来分析索引有效性:

(1)语法:

EXPLAIN [explain_type] SELECT select_options

(2)输出结果分析:

(五)实验5:索引的使用

// 创建表
MariaDB [test]> CREATE TABLE employees (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,NAME VARCHAR(10) NOT NULL,AGE TINYINT UNSIGNED,GENDER ENUM('M','F'),MAJOR VARCHAR(50));
// 脚本批量添加表记录,共500条
GENDER=("M" "F")
for i in {1..500};do mysql -e "INSERT INTO test.employees (NAME,AGE,GENDER) VALUES ('emp$i','$[$RANDOM%43+18]','${GENDER[$RANDOM%2]}')"; done

select_type='SIMPLE'表示当前为简单查询,type='ALL'表示为全表查询,此时尚未用到索引,rows代表预计查询需要读取的行数

type='range'表示根据索引范围搜索,possible_keys='age, age_and_name'表示可能用到的索引为age, age_and_name,key='age_and_name'表示真正使用的索引为age_and_name;

由于搜索字段为AGE,索引age, age_and_name都是以字段AGE开始,故系统认为他们可能被用到;而由于age_and_name索引包含了查询结果字段,故被选做实际用到的索引;

此时rows=112,相较没有设置索引时读入的行数大大减少,查询效率提升明显

此时搜索条件为NAME,故只有起始字段为NAME的索引name_and_age成为可能和实际被使用的索引;

type='range'表示查询为根据索引的范围查询

这是一个复合查询语句,主句的查询条件是子句的查询结果,在本例中通过子句查询年龄的平均值,再查询年龄小于平均值的记录的姓名与年龄字段值,select_type明确表明了查询语句的主从关系;

当type='index'并且Extra='Using index',表示查询使用了覆盖索引,效率较高

type='ref'表示查询属于精确查询,查询条件匹配单个值,而匹配结果可能不止一个

type='const'表示查询条件为精确查询某个常数,并且返回结果只有一行,通常在主键索引查询时出现

五、MySQL的用户和权限管理

(一)用户账号:user@host

(二)MySQL权限类别:

(三)用户管理命令

(四)授权管理

上一篇下一篇

猜你喜欢

热点阅读