查看当前表的存储引擎??
mysql> SHOW TABLE STATUS\\G 查看所有表的
mysql> SHOW TABLE STATUS LIKE 'studentss'\\G 查看students这张表的存储引擎 mysql> SHOW TABLE STATUS LIKE 's%'\\G
每张表的属性:
******************** 1. row *************************** Name: courses 表名
Engine: InnoDB 存储引擎类型 Version: 10 版本号 Row_format: Compact 行格式 Rows: 10 一共多少行 Avg_row_length: 1638 平均行的长度 Data_length: 16384 总体行的长度 Max_data_length: 0 最大数据长度 Index_length: 0 最大索引长度
Data_free: 10485760 数据空间
Auto_increment: 11 是否允许自动增长(下一个值) Create_time: 2012-11-29 14:24:56 创建时间 Update_time: NULL 更新时间 Check_time: NULL 检查时间 Collation: latin1_swedish_ci 排序规则
Checksum: NULL 总检查时间 Create_options: 创建选项 Comment: 注释
最著名引擎及特性:
MyISAM:管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是红帽5.5.3之前的默认的存储引擎。 MyISAM特性: 不支持事务 表级锁
InnoDB存储引擎提供事务安全表。InnoDB默认被包括在所有MySQL5.1二进制分发版里,可以按照喜好通过配置MySQL来允许或禁止任一引擎。 InnoDB特性:
支持事务(MVCC 多版本并发控制) 默认情况使用表空间管理数据 在默认隔离级别上使用了间隙锁,防止幻读 支持行级锁 所以
索引类型:B-Tree,Fulltext,R-Tree
支持延迟更新索引:优:可以尽可能降低磁盘I/O 缺:不能立即查看新索引 读多,写少的场景最适合该引擎(有些数据一旦产生,不会修改但是会查询多次) 适用于:数据仓库,所以Mysql也适合使用
支持预读功能(基于程序的局部性原理实现的)
自适应hash索引 可以避免死锁
想要更多了解InnoDB特性及其用法应抽时间一定要读一读官方手册。
其他的常见存储引擎:
BLACKHOLE 存储引擎接受但不存储数据,相当于数据库中的数据黑洞。
CSV 将数据保存在纯文本的文件中,方便在多种数据库之间导入导出。
MEMORY 工作在内存中的,适合于存储临时数据的临时表以及数据仓库的纬度表。 MRG_MYISAM 合并表,可以将一个大表分成小表,将小表合并成大表,但是不允许跨数据库跨服务器。
ARCHIVE 归档,将数据库压缩存放以后不再用于修改的
FEDERATED 联合的数据库表,可以联合多个数据库里的表进行存储,在mysql6.0以后才支持。
PERFORMANCE_SCHEMA 性能数据库,用来输出和统计当前mysql里面的性能数据的。
关于存储引擎变量:
SHOW GLOBAL VARIABLES; 查看服务器全局变量的
关于这些变量的解析详见马哥教育:http://mageedu.blog.51cto.com/4265610/1058357
锁:
分为两种:
读锁:又称为共享锁,一个用户的读操作不会影响另一个用户的读操作但不允许写。
写锁:又称为独占锁,一个用户的写操作会影响另一个用户的读写操作。
锁粒度:对MySQL来说很重要
分为三类:
表锁:一次直接对整张表进行加锁
页锁:对于整个页面(mysql管理数据的基本存储单位)进行加锁 行锁:只锁定某一行
锁的实现:
分为两个级别:
存储引擎级别(这个更接近于数据,更明白那些该加锁那些不该,所以建议存储引擎自我实现加锁)
服务器级别(手动加锁)
隐式锁(由mysql存储引擎自我实现的) 显示锁(用户手动施加的,不建议使用)
怎么在服务器级别上创建一个锁??
LOCK TABLES [AS] lock_type 以什么类型锁定表 UNLOCK TABLES 释放所有锁
LOCK TABLES students WRITE; 施加写锁 有时缓存会影响读写锁
LOCK TABLE READ; 施加读锁 在读锁条件下可以读取不可以写入修改
事务(Transaction)是:一组SQL语句
一个存储引擎或一个服务器是否满足事务要求,应用是否满足ACID来测试一下
ACID:指数据库事务正确执行的四个基本要素的缩写
A:原子性Atomicity 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
C:一致性Consisitency 当一个事务一旦执行完成,就必须从一个状态到另一个状态。 I:隔离性Isolation 一个事务操作时其他事务是否可以继续操作或看到 也就是说两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。虽然效率低但安全性高。
D:持久性Durability 一旦一个事务交易完成,将永久储存并不会被回滚(ROLLBACK:提交过的数据不想提交了)。
事务的隔离级别:
隔离级别一共分为四种: SHOW GLOBAL VARIABLES LIKE 'tx%';查看默认级别 1,Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
2,Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一操作可能返回不同结果。 3,Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 4,Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
SET tx_isolation='隔离级别' 切换隔离级别
SHOW VARIABLES LIKE 'a%';
autocommit 自动提交 对于InnoDB来说必须要关掉。
【MySQl的用户管理:】
用户授权相关的:
User,host,db 数据库级别的授权
columns_priv 对表中的数据列进行操作的权限 tables_priv 表级别的授权 proce_priv 基于进程
新建的用户,授权
FLUSH PRIVILEGES; 让mysql数据库服务器重读授权表
connection 联结权限
CREATE USER 创建用户
用户账号:用户@来源地址
create USER testuser@'172.16.%.%';
SET PASSWD FOR testuser@ '%'=PASSWOD('redhat') 设置登录密码
DROP USER username@host; 删除用户
权限分为以下四种级别: 服务器级别:管理类 数据库级别: 表级别: 字段级别:
【管理类的权限:】
CREATE TEMPORARY TABLES 允许创建临时表的权限
CREATE USER 创建用户
FILE 读写服务器主机上的文件
process 允许你查看和终止任何客户线程
lock tables 锁定表
reload 允许你进行一些数据库管理操作,如flash和reset命令
REPLICATION CLIENT 允许查询镜像机制中主服务器和从服务器的位置。
REPLICATION SLAVE 允许某个客户连接到镜像机制中的主服务器并请求发送二进制变更日志。
SHOW DATABASES 用户是否具有查看数据库权限
SHUTDOWN 关闭
SUPER 不便归类的管理类权限
【数据库级别访问权限:】
ALTER 修改表
ALTER ROUTINE 修改或删除存储历程
CREATE 创建表
CREATE ROUTINE 创建历程的权限
CREATE VIEW 创建视图的权限
DELETE 从表中删除行的权限
DROP 删除库或者表的权限
EXECUTE 执行存储历程的权限
GRANT OPTION 用户是否有权限将权限授权给别人
INDEX 创建或删除索引的权限
INSERT 添加行的权限
SELECT 查询权限
SHOW VIEW 查看创建视图权限
UPDATE 更改行的权限