MySQL:
一:
DML:DML是Data Manipulation Language的缩写,意思是数据操纵语言,是指在SQL语言中,负责对数据库对象运行数据访问工作的指令集,
以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,是开发以数据为中心的应用程序必定会使用到的指令。
在执行INSERT、UPDATE、DELETE指令时,InnoDB 性能更优。
执行select指令时,MyISAM 性能更优。
二: InnoDB MyISAM优缺点
1、MySQL默认存储引擎的变迁
在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5。5之后的版本中,默认的搜索引擎变更为InnoDB。
2、MyISAM与InnoDB存储引擎的主要特点
MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;
InnoDB存储引擎的特点是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB和MyISAM的最大不同点有两个:一,InnoDB支持事务(transaction);二,默认采用行级锁。加锁可以保证事务的一致性;
我们先简单了解一下事务知识。
MySQL 事务属性
事务是由一组SQL语句组成的逻辑处理单元,事务具有ACID属性。
原子性(Atomicity):事务是一个原子操作单元。在当时原子是不可分割的最小元素,其对数据的修改,要么全部成功,要么全部都不成功。
一致性(Consistent):事务开始到结束的时间段内,数据都必须保持一致状态。
隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的”独立”环境执行。
持久性(Durable):事务完成后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
常见的锁:
间隙锁
当我们用范围条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做”间隙(GAP)”。
InnoDB也会对这个”间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。
排他锁
排他锁,也称写锁,独占锁,当前写操作没有完成前,它会阻断其他写锁和读锁。
共享锁
共享锁,也称读锁,多用于判断数据是否存在,多个读操作可以同时进行而不会互相影响。当如果事务对读锁进行修改操作,很可能会造成死锁。
行锁与表锁
当插入数据时,就锁定表,这叫做”锁表”;当更新数据时,就锁定行,这叫做”锁行”。
三:mysql权限
1、DCL
1-1、DCL的概述
DCL(Data Control Language 数据控制语句)的操作是数据库对象的权限,这些操作的确定使数据更加的安全。
1-2、DCL的主要语句(操作)
Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。
Revoke语句:可以废除某用户或某组或所有用户访问权限
1-3、DCL的操作对象(用户)
此时的用户指的是数据库用户。
语法:
增加权限
grant 权限名1, 权限名2, … on 数据库名.对象名 to ‘用户名’@’允许其登录的地址’ identified by ‘密码’;
权限名就是:‘select’,‘update’, ‘delete’等等,ALL/all privileges代表“所有权限”
.表示所有数据中的所有对象
某数据库名.表示该数据库中的所有对象
identified by ‘密码’用于给一个用户在此时修改密码,不写就不修改密码
该语句也可以创建用户(如果不存在),此时identified by ‘密码’必须写
eg:
mysql> grant all on . to wang@’192.168.1.150’ identified by “password”; //all等同于all privilege,其中的privileges可以省略
mysql> grant all privileges on . to wang@’192.168.1.%’ identified by “123456”; //192.168.1.%表示一个网段
mysql> grant insert,select on testdb. to wang@’%’ identified by “123456”;
mysql> flush privileges; //授权之后,需要手动更新权限表
查询权限
查询当前用户的权限
mysql> show grants;
查询指定用户下的权限
mysql> show grants for wang@’192.168.1.%’;
删除权限
revoke 权限名1,权限名2, …. on 数据库名.对象名 from ‘用户名’@’允许其登录的地址’;
eg:
mysql> revoke create on test.test from ‘user1’@’%’;
mysql> flush privileges;
