语法:
LOCK TABLES tbl_name [[AS] alias] lock_type[, tbl_name [[AS] alias] lock_type] ... |
lock_type:锁类型: READ [LOCAL] | [LOW_PRIORITY] WRITE |
例子1(施加读锁) |
mysql> LOCK TABLES classes READ; //我对此表施加为读锁: Query OK, 0 rows affected (0.00 sec) mysql> select * from classes; //此时我发起查询后没有问题,开多个终端同时访问的结果也是可以读(查询) +---------+----------------+----------+ | ClassID | Class | NumOfStu | +---------+----------------+----------+ | 1 | Shaolin Pai | 10 | | 2 | Emei Pai | 7 | | 3 | QingCheng Pai | 11 | | 4 | Wudang Pai | 12 | | 5 | Riyue Shenjiao | 31 | | 6 | Lianshan Pai | 27 | | 7 | Ming Jiao | 27 | | 8 | Xiaoyao Pai | 15 | +---------+----------------+----------+ 8 rows in set (0.00 sec) mysql> INSERT INTO classes VALUE (9,‘taoyuanji‘,34); //如果我对其插入数据那么它将阻塞,我的终端中没有任何输出了 mysql> UNLOCK TABLES; //解锁 Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO classes VALUE (9,‘taoyuanji‘,34); //只要一解锁这边就成功写入(看这条插入语句所经历的时间) Query OK, 1 row affected (1 min 21.91 sec) |
例子2(施加写锁) |
mysql> LOCK TABLES classes WRITE; //我对此表施加为读锁(如果别人也施加了写锁,那我这里会失败的) Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM classes; //我在另外一个终端中发起查询操作,此时我键入此语句后它将会阻塞,因为写锁是独占的,排他性的,所以其他用户的读和写此时都将会阻塞; mysql> UNLOCK TABLES; //解锁 Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO classes VALUE (9,‘taoyuanji‘,34); //当写锁被解锁后立即完成查询操作(看它的时间) Query OK, 1 row affected (1 min 21.91 sec) mysql> SELECT * FROM classes; +---------+----------------+----------+ | ClassID | Class | NumOfStu | +---------+----------------+----------+ | 1 | Shaolin Pai | 10 | | 2 | Emei Pai | 7 | | 3 | QingCheng Pai | 11 | | 4 | Wudang Pai | 12 | | 5 | Riyue Shenjiao | 31 | | 6 | Lianshan Pai | 27 | | 7 | Ming Jiao | 27 | | 8 | Xiaoyao Pai | 15 | | 9 | taoyuanji | 34 | +---------+----------------+----------+ 9 rows in set (3 min 20.79 sec) |
InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁);
SELECT ......LOCK IN SHARE MODE; SELECT ......FOR UPDATE; |
事务:Transaction
ACID测试:能满足ACID测试就表示其支持事务,或兼容事务.
A:Atomicity 原子性 C:Consistency 一致性 I:Isolation 隔离性,一个事务的所有修改操作在提交之前对其他事务是不可见的 D:Durability 持久性,一旦事务得到提交,其所做的修改会永久有效 |
READ UNCOMMITTED(读未提交) 脏读,不可重读;能够看到别人尚未提交的修改 READ COMMITTED(读提交) 不可重读,幻读 REPEATABLE READ(可重读) 幻读 SERIALIZABLE(可串行化) 强制事务的串行执行避免了幻读 |
mysql>HELP CONTENTS; mysql>HELP Transcations mysql>START TRANSACTION 开启事务 mysql>COMMIT 提交 mysql>ROLLBACK 回滚 |
mysql>SAVEPOINT identifier |
回滚到指定的位置
mysql>ROLLBACK [WORK] TO [SAVEPOINT] identifier RELEASE SAVEPOINT identifier |
如果没有显示启动事务,每个语句都会当作一个单独的事务,其执行完成后会被自动提交;
mysql>SHOW GLOBAL VARIABLES LIKE ‘autocommit‘; or mysql>SELECT @@ GLOBAL.autocommit; |
mysql>SET GLOBAL autocommit = 0; |
mysql>SHOW {GLOBAL|SESSION} VARIABLES LIKE ‘tx_isolation‘; or mysql>SELECT @@{GLOBAL|SESSION}.tx_isolation; |
mysql>set {GLOBAL|SESSION} tx_isolation ‘各隔离级别名‘ |
查看本mysql服务器所支持的存储引擎:
mysql>SHOW ENGINES; |
mysql>SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE ‘pattern‘ | WHERE expr] |
一张表中的状态详细信息
Name: 表名 Engine: 存储引擎 Version: 版本 Row_format: 行格式 {DEFAULT|DUNAMIC|FIXED|COMPRESSED|PREDUNDANT|COMPACT} Rows: 表中的行数 Avg_row_length: 平均每行包含的字节数 Data_length: 表数据的总体大小(表中的行数*平均每行包含的字节数) Max_data_length: 表的最大占用空间的容量 Index_length: 索引 的大小 Data_free: 对于MyISAM表,表示已分配,但尚未使用的空间;包含了以前被删除的行,这些空间可以用于以后的INSERT语句 Auto_increment: 下一个AUTO_INCREMENT的值 Create_time: 表的创建时间 Update_time: 表数据的最近一次的修改时间 Check_time: 使用CHECK TABLE或myisamchk最近一次检测表的时间 Collation: 排序规则 Checksum: 如果启用,则为表的checksum Create_options: 创建表时指定使用的其他选项 Comment: 表的注释 |
事务:事务日志 外键: MVCC:多版本并发控制 聚簇索引: 聚簇索引(对于INNODB来说)之外的其他索引,通常成为辅助索引 辅助索引-->聚簇索引-->数据 索引类型:B树索引, R树索引, hash索引, 全文索引 行级锁:间隙锁 支持辅助索引: 支持自适应hash索引 支持热备份 |
全文索引: 支持表压缩,用于是实现数据仓库,能节约存储空间并提升性能 空间索引 表级锁 延迟更新索引 不支持事务, 外键, MVCC, 行级锁;崩溃后无法安全恢复数据; 适用场景:只读数据, 较小的表, 多读少写 |
仅支持INSERT和SELECT,支持很好的压缩功能 适用于存储日志信息,或其他按照时间序列实现的数据采集类的应用; 不支持事务,不能很好的支持索引; |
将数据存储为CSV格式,不支持索引;仅适用于数据交换场景; |
没有存储机制,任何发往此引擎的数据都会被丢弃;其会记录二进制日志,因此,常用于多级复制架构中作中转服务器; |
保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等;也用于实现临时表 支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型; |
是MYISAM的一个变种,能够将多个MyISAM表合并一个虚表; |
NDB:
是MySQL CLUSTER中专用的存储引擎 |
OLTP类:
XtraDB:增强的InnoDB,由Percona提供; 编译安装mysql时下载XtraDB的源码替换存储引擎中的InnoDB的源码 PBXT:MariaDB自带此存储引擎 支持引擎级别的复制、外键约束、对SSD磁盘提供适当的支持; 支持事务、MVCC ToKuDB:使用Fractal Trees索引,适用于存储大数据,拥有很高的压缩比;已经被引入MariaDB; |
Infobright:适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计; InfiniDB MonetDB LucidDB |
Aria:前身Maria,增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存) Groona:全文索引引擎;完成全站搜索——>改进版,基于Mroonga二次开发 OQGraph:由Open Query研发,支持图结构的存储引擎 SphinxSE:为Sphinx全文搜索服务器提供了SQL接口 Spider:能将数据切分成不同分片,比较高效透明地实现了分片,并支持在分片上支持并行查询; |
更多详细信息可以参考此表
如何选择一个适合于自己的存储引擎:
1.是否需要事务 2.备份的类型的支持 3.崩溃后的恢复 4.特有的特性 综合考虑即可! |
Mysql用户管理:
用户账号:‘username‘@‘hostname‘,password
mysql>CREATE USER mysql>DROP USER mysql>RENAME USER mysql>SET PASSWORD |
mysql>GRANT mysql>REVOKE |
创建用户:默认获取到的授权为USAGE
mysql>CREATE USER ‘username‘@‘hostname‘ [IDENTIFIED BY [PASSWORD] ‘password‘ ]; |
mysql>SHOW GRANTS FOR ‘username‘@‘hostname‘ |
mysql>RENAME old_‘username‘@‘hostname‘ TO new_‘username‘@‘hostname‘ |
mysql>SET PASSWORD FOR ‘username‘@‘hostname‘ |
Mysql用户权限管理:
CREATE TEMPORARY TABLES 创建临时表 CREATE USER 创建用户 FILE 在服务器上读取或写入文件 SUPER 不便归类的权限,杂项 SHOW DATABASES 列出数据库 RELOAD 重置 SHUTDOWN 关闭服务器 REPLICATION SLAVE 复制从服务器的权限,从服务器到主服务器上复制数据需要SLAVE权限从服务器上的用户必须具有上面两个权限才能从主服务器上复制数据 REPLICATION CLIENT 复制客户端权限,如果一个用户需要到服务器上获取复制主机的相关信息,需要CLIENT权限 LOCK TABLES 显示施加表锁 PROCESS 查看线程列表(msyql>SHOW PROCESSLIST) |
ALTER 修改TABLE ALTER ROUTINE 修改存储历程(存储过程、存储函数) CREATE 创建表和库 CREATE ROUTINE 创建存储过程或存储函数 CREATE VIEW 创建视图 DROP 删除库或表 EXECUTE 执行存储过程或存储函数 GRNAT OPTION 把自己获得的权限转让 INDEX 创建和删除索引 SHOW VIEW 查看一个视图是如何创建的 |
SELECT 删除 INSERT 插入 UPDATE 更新 DELETE 删除 |
SELECT(col1,...) UPDATE(col1,...) INSERT(col1,...) |
ALL [PRIVILEGES] |
GRANT命令用法
GRANT ALL ON [FUNCTION] *.* GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [TABLE|FUNCTION|PROCEDURE] priv_level TO username@hostname [IDENTIFIED BY ‘password‘], [username@hostname [],...] [REQUIRE SSL] [WITH with_option ...] priv_level: * 所有对象 | *.* 所有库的所有对象 | db_name.* 指定库的所有对象 | db_name.tbl_name 指定库的制定表 | tbl_name 指定表 | db_name.routine_name 指定库的存储历程 with_option: GRANT OPTION 把自己获得的权限转赠给其他用户 | MAX_QUERIES_PER_HOUR count 每小时所执行的最多查询请求次数 | MAX_UPDATES_PER_HOUR count 每小时所执行的最多更新次数 | MAX_CONNECTIONS_PER_HOUR count 每小时所能建立连接的次数 | MAX_USER_CONNECTIONS count 指定某个用户帐号最多能同时使用一个帐号连接的次数 |
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... |
db:库级别权限 host:主机级别权限,已废弃 tables_priv:列级别的权限 procs_priv:存储过程和存储函数相关的权限 proxies_priv:代理用户权限 |
2.将查询后返回的数据给缓存下来,它能够保存查询返回的完整结果;被命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段。
如何检查缓存?
MySQL日志:
查询日志:(默认是关闭的)
+-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.01 sec)
#过滤器log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk#是否启用记录慢查日志
#定义慢查速率
log_slow_rate_limit=1#是否记录详细格式的日志信息
log_slow_verbosity
log_warnings 1 -->默认记录了mysql服务器的警告信息
本文出自 “一叶知秋” 博客,请务必保留此出处http://maoqiu.blog.51cto.com/8570467/1394389
Mysql学习之基础知识总结(三),布布扣,bubuko.com
原文:http://maoqiu.blog.51cto.com/8570467/1394389