关系型数据库之Mysql引擎-日志-用户管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关系型数据库之Mysql引擎-日志-用户管理相关的知识,希望对你有一定的参考价值。

MySQL锁机制

     相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

执行操作时施加的锁的模式
    读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁
    写锁:独占锁,排它锁。其他用户不能读,不能写


mysql大致可归纳为以下3种锁:
    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

锁的实现位置:
MySQL锁:可以手动使用,可以使用显示锁
存储引擎锁:自动进行的(隐式锁),
显示锁:
    lock tables:施加锁
    LOCK TABLES
   tbl_name lock_type
   [, tbl_name lock_type]  
锁的类型:
READ | WRITE
    unlock tables:解锁

案例演示之读锁:

客户端A:对student表施加读锁

mysql> LOCK TABLES student READ;
mysql> UNLOCK TABLES;

技术分享

客户端B:对student表执行编辑操作,可以看到是无法正常执行的,查询操作没有问题:

mysql> select * from student;
mysql> update student set Class = 1 where Age = ‘18‘;

技术分享

下图为解锁后执行的语句结果:

技术分享


案例演示之写锁:

客户端A:对student表施加写锁

mysql> LOCK TABLES student WRITE;
mysql> UNLOCK TABLES;

技术分享

客户端B:对student表执行编辑操作,可以看到是无法正常执行的,查询操作也是无法执行:

技术分享


表引擎必须是Innodb引擎:

InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
    select .... lock in share mode
    select .... for update
做备份时要手动施加读锁


事务:Transaction
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元
    ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
    A:Atomicity,原子性,都执行或者都不执行
    C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
    I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
    D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效
安全性越高,并发性越低


    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
       在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容)
       这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重读)
       这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。


Serializable(可串行化)
       这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
         脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
         不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
         幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。


下面我们通过实际分析事务级别的应用:

两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。

(1)将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:

mysql> SET GLOBAL tx_isolation=‘READ-UNCOMMITTED‘;
mysql> SELECT @@global.tx_isolation;
mysql> START TRANSACTION;
mysql> SELECT * FROM student;


技术分享

B更新数据:
客户端B: 

mysql> UPDATE students SET ClassID = ‘99‘ WHERE SID = ‘1‘;
mysql> SELECT * FROM students;
mysql> ROLLBACK;
mysql> SELECT * FROM students;

技术分享

客户端A:

技术分享

经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。


(2)将客户端A的事务隔离级别设置为read committed(已提交读)
在B未更新数据之前:
客户端A:

mysql> SET GLOBAL tx_isolation=‘READ-COMMITTED‘;
mysql> SELECT @@global.tx_isolation;
mysql> START TRANSACTION;
mysql> SELECT * FROM students;

技术分享

B更新数据:
客户端B:

mysql> START TRANSACTION;
mysql> UPDATE students SET ClassID = ‘99‘ WHERE SID = ‘1‘;
mysql> SELECT * FROM students;
mysql> COMMIT;


技术分享

客户端A:

技术分享

   经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。


(3)将A的隔离级别设置为repeatable read(可重复读)
在B未更新数据之前:
客户端A:

mysql> SET GLOBAL tx_isolation=‘REPEATABLE-READ‘;
mysql> SELECT @@global.tx_isolation;
mysql> START TRANSACTION;
mysql> SELECT * FROM students;

技术分享

B更新数据:
客户端B:

技术分享

由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务 两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生 幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。

(4)SERIALIZABLE (可串行化)
    强制事务的串行执行避免了幻读;



跟事务相关的常用命令

 mysql> START TRANSACTION
 mysql> COMMIT
 mysql> ROLLBACK
 mysql> SAVEPOINT identifier
 mysql> ROLLBACK [WORK] TO [SAVEPOINT] identifier

如果没有显式启动事务,每个语句都会当作一个独立的事务,其执行完成后会被自动提交;

 mysql> SELECT @@global.autocommit;
 mysql> SET GLOBAL autocommit = 0;

关闭自动提交,请记得手动启动事务,手动进行提交;

查看MySQL的事务隔离级别

 mysql> SHOW GLOBAL VARIABLES LIKE ‘tx_isolation‘;
 mysql> SELECT @@global.tx_isolation;

建议:对事务要求不特别严格的场景下,可以使用读提交;

MVCC:多版本并发控制
每个事务启动时,InnoDB为会每个启动的事务提供一个当下时刻的快照;
    为了实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间;
    里面存储的是系统版本号;(system version number)
    只在两个隔离级别下有效:READ COMMITTED和REPEATABLE READ


MySQL存储引擎
首先安装MariaDB,利用MariaDB详解存储引擎

使用通用二进制格式安装MariaDB如下:

(1)创建数据库服务用户:

# groupadd -r mysql
# mkdir -p /mydata/data 
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data/

(2)下载二进制安装包,创建数据库二进制源码包软连接

# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/# cd /usr/local/
# ln -sv mariadb-5.5.36-linux-x86_64 mysql
# cd mysql/

技术分享

(3)初始化数据库

# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

(4)提供配置文件

# cp support-files/my-large.cnf /etc/my.cnf
# vim /etc/my.cnf     --添加下面选项
datadir = /mydata/data
innodb_file_per_table = on

(5)提供服务脚本

# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# vim /etc/rc.d/init.d/mysqld   --补充以下选项
basedir=/usr/local/mysql
datadir=/mydata/data

加入服务列表启动服务:

# chkconfig --add mysqld
# chkconfig mysqld on
# service mysqld start

(6)提供PATH环境变量

# vim /etc/profile.d/mysqld
PATH=/usr/local/mysql/bin/:$PATH
# . /etc/profile.d/mysqld

(7)提供man手册至man命令的查找路径

# vim/etc/man.config --加入下行内容
MANPATH    /usr/local/mysql/man

(8)输出MariaDB的头文件至系统头文件路径

# ln -sv /usr/local/mysql/include /usr/include/mysql

(9)输出MariaDB的库文件给系统的查找路径

# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
# ldconfig 
# ldconfig -v | grep mysql

 以上为MariaDB过程。



查看MySQL所支持的存储引擎和表使用引擎

1.查询所支持的数据库引擎:

MariaDB [(none)]> SHOW ENGINES;

2.查看表属性

mysql> SHOW TABLE STATUS IN db_name [LIKE pattern] [WHERE clause];
mysql> SHOW TABLE STATUS IN hellodb LIKE "stu%" \G;
*************************** 1. row ***************************
           Name: students
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 25
 Avg_row_length: 24
    Data_length: 624
Max_data_length: 281474976710655
   Index_length: 2048
      Data_free: 0
 Auto_increment: 26
    Create_time: 2016-05-12 10:33:39
    Update_time: 2016-05-12 10:33:39
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment:
---------------------------------------------------------------
各项解释:        
        Name: 表名
        Engine: 存储引擎
        Version: 版本(表的当前版本)
        Row_format: 行格式,创建表的命令中可以定义 {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
        Rows: 表中的行数
        Avg_row_length: 平均每行所包含的字节数;
        Data_length: 表中数据总体大小,单位是字节
        Max_data_length: 表能够占用的最大空间,单位为字节,0表示没有上限。 
        Index_length: 索引的大小,单位为字节
        Data_free: 对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间
        Auto_increment: 下一个AUTO_INCREMENT的值;
        Create_time: 表的创建时间;
        Update_time:表数据的最近一次的修改时间;
        Check_time:使用CHECK TABLE或myisamchk最近一次检测表的时间;
        Collation: 排序规则
        Checksum: 如果启用,则为表的checksum;
        Create_options: 创建表时指定使用的其它选项;
        Comment: 表的注释信息

Innodb存储引擎,所产生的文件格式:
1.参数innodb_file_per_table=OFF时:
    每张表具有单独的表结构文件tb_name.frm
    数据内容使用共享表空间文件, ibdata#

2.参数innodb_file_per_table=ON时候:
    每张表具有两个独立文件
    tb.name.frm 表空间文件
    tb_name.ibd
    表空间文件(table space): 由innodb管理的特有格式的数据文件,内部存储索引和数据,支持聚簇索引


MyISAM存储引擎产生的文件: 每个表都在数据库目录下存储三个文件:
1. tb_name.frm : 表结构
2. tb_name.MYD : 数据
3. tb_name.MYI : 索引
通过修改default_storage_engine来修改默认存储引擎,需要写在配置文件中。


各引擎特性

1)Innodb:

事务:事务日志
外键:
MVCC:多版本并发机制,主要是用于支持事务
聚簇索引只能有一个
聚簇索引之外的其他索引,通常称为辅助索引
所有的辅助索引是指向聚簇索引的。而非指向元数据。
通常使用主键用于聚簇索引
无论聚簇索引还是辅助索引都是B+树索引
行级锁: 间隙锁,用来隔离行
支持辅助索引,
自适应的hash索引,
支持热备份,

2)MyISAM:

全文索引
支持表压缩,但是压缩后不能修改,用于制作数据仓库,可节约空间提高性能
空间索引
表级锁
延迟更新索引: 每当数据更新时,不需要立即更新索引,以降低I/O压力
不支持事务,外键和行级锁
崩溃无法安全可靠的恢复数据。
使用场景: 只读取数据,较小的表,奔溃后可以忍受数据恢复时间和数据丢失。

3)ARCHIVE:

仅支持INSERT和SELECT,支持很好压缩功能;
适用于存储日志信息,或其他按时间序列实现的数据采集类的应用;
不支持事务,不能很好的支持索引;

4)CSV:

将数据存储为CSV格式;不支持索引;仅适用数据交换场景,另外貌似精度很难保持;

5)BLACKHOLE:

没有存储机制,任何发生此引擎的数据都会丢失,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器;

6)MEMORY:

保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等;也用于实现临时表
支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型。

7)MRG_MYISAM

MYISAM的变种,能够将多个MyISAM表合并成一个虚表;

8)NDB

MySQL Cluster中专用的存储引擎


第三方的存储引擎

1.OLTP类:

XtraDB:增强的InnoDB,由Percona提供;
编译安装时,下载XtraDB的源码替换MySQL存储引擎中的InnoDB的源码
PBXT:MariaDB自带此存储引擎
支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持;
支持事务、MVCC

2.TokuDB:使用Fractal Trees索引,没有碎片问题,性能与换从无关,适用存储大数据,拥有很大的压缩比;已经被引入MariaDB;

列式存储引擎;
Infobright: 目前较有名的列式引擎,使用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计;
如果用于MySQL,需要对MySQL做定制。


开源社区存储引擎:

1. Aria:前身为Maria,可理解为增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)
2.Groona:全文索引引擎,Mroonga是基于Groona的二次开发版,适用于搜索引擎
3.OQGraph: 由Open Query研发,支持图结构的存储引擎
4.SphinxSE: 为Sphinx全文搜索服务器提供了SQL接口
5.Spider: 能数据切分成不同分片,比较高效透明地实现了分片(shared),并支持在分片上支持并行查询;


如何选择数据存储引擎:

1.是否需要事务

2.备份的类型的支持

3.奔溃后的恢复

4.特有的特性


MySQL的用户管理及用户权限管理:

mysql用户管理

1.用户格式:

[email protected]{host_IP|host_name}

{host_IP|host_name}:需要登录mysql服务器的主机IP


2.mysql用户管理的相关命令:

mysql> CREATE USER user_name IDENTIFIED BY {‘auth_string‘ | PASSWORD ‘hash_string‘}
mysql> DROP USER user_name
mysql> RENAME USER old_user TO new_user
mysql> SET PASSWORD FOR ‘user_name‘@‘%.example.org‘ = PASSWORD(‘cleartext password‘);


MySQL的权限控制:

1.权限管理命令:

  权限授予:

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
           ON [object_type] priv_level
           TO user_specification [, user_specification] ...
           [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
           [WITH {GRANT OPTION | resource_option} ...]
mysql> GRANT PROXY ON user_specification TO user_specification [, user_specification] ... [WITH GRANT OPTION]

权限回收:

REVOKE priv_type [(column_list)][, priv_type [(column_list)]] ...
            ON [object_type] priv_level
            FROM user [, user] ...
            REVOKE PROXY ON user FROM user [, user] ...

查看用户能够使用的权限:

mysql> SHOW GRANTS FOR [email protected]‘hostname‘;
mysql> SHOW GRANTS FOR [email protected]‘mysql.samlee.com‘\g;

作用对象类型(priv_type)

1.TABLE(默认)

2.FUNCTION

3.PROCEDURE

权限目标级别(priv_level)

  1. *所有: 库,表,函数

  2. *.* 所有库的所有[TABLE|FUNCTION|PROCEURE]

  3. db_name.*  db_name库的所有

  4. db_name.tbl_name

  5. tbl_name

  6. db_name.routine_name


WITH GRANT OPTION:权限授予选项

1.MAX_QUERIES_PER_HOUR count

2.MAX_UPDATES_PER_HOUR count

3.MAX_CONNECTIONS_PER_HOUR count

4.MAX_USER_CONNECTIONS count


权限类型

1.管理类权限:

CREATE TEMPORARY TABLES: 使用或者创建临时表
CREATE USER:创建,删除,重命名用户
FILE: 在服务器上读或者写,包括备份,以及source文件
LOCK TABLES:是否可以锁表
PROCESS:是否执行SHOW PROCESSLIST 命令查看mysql内部运行的线程
RELOAD:是否能使用FLUSH和RESET命令
REPLTCATION SLAVE: 是否可以查询主服务器有哪些从服务器
REPLTCATION CLIENT: 是否有权限成为从服务器
SHOW DATABASES: 是否可以查询服务器中哪些数据库
SHUTDOWN: 关闭
SUPER:其他

2.库级别和表级别:

ALTER: 是否可以执行ALTER TABLE命令
ALTER ROUTINE: 修改存储过程,包括存储函数
CREATE: 创建表和库
CREATE ROUTINE:创建存储过程和函数
CREATE VIEW:创建视图

3.数据操作(表级别):

SELECT:查询
INSERT:增加
UPDATE:修改
DELETE:删除
SELECT(col1,....)
INSERT(col1,....)
UPDATE(col1,....)

4.所有权限

ALL [PRIVILEGES]

ssl选项(ssl_option):

SSL
X509:证书格式
CIPHER ‘cipher‘ 加密方式
ISSUER ‘issuer‘ 证书颁发者
SUBJECT ‘subject‘ 拒绝某证书


常用存储用户权限信息表,全部存储在mysql库中

db: 库级别权限
host: 主机级别权限,已废弃不用了
tables_priv : 表级别权限
colomns_priv: 列级别的权限
procs_priv: 存储过程和存储函数相关的的权限
proxies_priv: 代理用户权限

授权案例:

1. 授予testuser能够通过192.168.98.0/24网络内的任意主机访问当前mysql服务器的权限;    
    mysql> GRANT SELECT ON TABLE *.* TO ‘testuser‘@‘192.168.98.%‘ IDENTIFIED BY ‘testuser‘;
2. 让此用户能够创建及删除testdb数据库,及库中的表;
    GRANT CREATE,DROP ON TABLE testdb.* TO ‘testuser‘@‘192.168.98.%‘ ;
3. 让此用户能够在testdb库上执行创建和删除索引;
    GRANT INDEX ON TABLE testdb.* TO ‘testuser‘@‘192.168.98.%‘ ;
4. 让此用户能够在testdb.t2表上查询id和name字段,并允许其将此权限转授予其他用户;
    GRANT GRANT OPTION,SELECT(id,name) ON TABLE testdb.t2 TO ‘testuser‘@‘192.168.98.%‘ ;
5、让此用户能够在testdb库中的t1表中执行查询、删除、更新和插入操作;
    GRANT SELECT,DELETE,UPDATE,INSERT ON TABLE testdb.tb1 TO ‘testuser‘@‘192.168.98.%‘;


MySQL查询缓存

用于保存MySQL查询语句返回的完整结果。被命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段

如何检查缓存

1.MySQL保存结果于缓存中:

2.把SELECT语句本身做hash计算,计算的结果作为KEY,查询结果作为VALUE。


什么样的语句不会被缓存?

查询语句中有一些不确定数据时,不会缓存: 例如NOW(),CURRENT_TIME();一般来说,如果查询中包含用户自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会缓存;


缓存会带来额外开销:

1.每个查询都得先检查是否被命中;

2.查询结果要先缓存;


缓存相关的服务器变量

mysql> 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_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
query_cache_type: 查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND};
DEMAND:意味着SELECT语句明确使用 SQL_CACHE 选项时才会缓存;
query_cache_size: 总空间,单位为字节,大小必须是1024的整数倍。MySQL启动时,会一次分配并立即初始化这里指定大小的内存空间;这意味着,如果修改此大小,会清空缓存并重新初始化的。
query_cache_min_res_unit: 存储缓存的最小内存块;(query_cache_size - Qcache_free_memory)/Qcache_queries_in_cache能够获得一个理想的值。
query_cache_limit: 单个缓存对象的最大值,超出时则不预缓存;手动使用SQL_NO_CACHE可以人为地避免尝试缓存返回结果超出此参数限定值的语句。
query_cache_wlock_invalidate: 如果某个表被其它用户连接锁住了,是否仍然从缓存中返回结果。OFF表示返回。

如何判断命令率(缓存相关的状态变量):

mysql> SHOW GLOBAL STATUS LIKE ‘Qcache%‘;
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 3        |
| Qcache_free_memory      | 16741608 |
| Qcache_hits             | 31       |
| Qcache_inserts          | 81       |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 154      |
| Qcache_queries_in_cache | 13       |
| Qcache_total_blocks     | 35       |
+-------------------------+----------+
Qcache_hits: 命中次数
Qcache_free_memory: 剩余缓存空间,尚未划分成块的空间
Qcache_free_blocks: 空闲的块数,划分完成但还没使用的空间
Qcache_total_blocks: 总块数
Qcache_queries_in_cache: 在缓存中,缓存插入的次数。 
Qcache_not_cached: 没有缓存的 
Qcache_lowmem_prunes: 因为内存太少而修剪内存的次数。 
碎片整理:FLUSH QUERY_CACHE
清空缓存:RESET QUERY_CACHE

计算命中率:

mysql> SHOW GLOBAL STATUS WHERE Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_select‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 251   |
| Qcache_hits   | 31    |
+---------------+-------+
Com_select: 非缓存查询次数
Qcache_hits: 缓存命中次数
Qcache_hits/(Com_select+Qcache_hits)
也应该参考另外一个指标:命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1,则表明缓存也是有效的。能达到10:1,为比较理想的情况。

MySQL缓存优化使用思路:

1、批量写入而非多次单个写入;
2、缓存空间不宜过大,因为大量缓存同时失效时会导致服务器假死;
3、必要时,使用SQL_CACHE和SQL_N0_CACHE手动控制缓存;
4、对写密集型的应用场景来说,禁用缓存反而能提高性能;


MySQL日志:

日志分类

1.查询日志:繁忙的服务器不建议记录查询日志
2.慢查询日志:查询执行时长超过指定时长的查询,即为慢查询
3.错误日志:
4.事务日志: ib_logfile0 ib_logfile1
随机I/O转换为顺序I/O从而保证ACID的持久性。只要事务提交,马上写入事务日志中。
事务日志有可能承担读操作,innodb_buffer可能会把装不下的内容放入事务日志
5.日志文件组:

特性:

1)至少应该有两个日志文件。
2)第一个满了以后,启动第二个。第一个日志文件开始向磁盘同步。
3)如果事务刚写到事务日志中数据库奔溃,再重启后,会把事务日志继续同步至数据文件,从而达到一致性。
4)但如果事务日志所在的磁盘损坏导致奔溃,则无法恢复。所以要保证事务日志所在存储足够可靠。
5)为了分摊事务日志I/O和同步数据文件的I/O,数据文件和事务日志要分开存放

相关参数:

innodb_log_file_size 事务日志大小 
innodb_log_files_in_group    事务日志组个数
innodb_log_group_home_dir    事务日志所在位置,"./"是安装目录
innodb_flush_log_at_trx_commit  是否事务提交后马上同步日志
可以放在固态硬盘上从而提高性能。
注意:尽可能使用小事务以提升事务引擎的性能。以保证尽量在回滚时,降低硬盘I/O开销

查询查询日志: 繁忙的服务器不建议开启

log={ON|OFF}:是否记录所有语句的日志信息于一般查询日志文件(general_log),5.6以后弃用,重复选项;    
log_output={TABLE|FILE|NONE}
TABLE和FILE可以同时出现,用逗号分隔即可;
TABLE : 记录到表中,在mysql库中的general_log 表 
FILE : 记录到文件中,在general_log_file 选项指定日志存放位置
general_log:是否启用查询日志;
general_log_file:定义一般查询日志保存的文件

慢查询日志: 用于评估系统性能,procona有工具用来分析慢查寻日志

long_query_time: 10.000000        
    定义多长时间算是慢,单位为秒
slow_query_log={ON|OFF}
    设定各用户级别是否启用慢查询日志;它的输出位置也取决log_output={TABLE|FILE|NONE};
slow_query_log_file=www-slow.log 
    定义日志文件路径及名称;
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_queries=ON    
    只有管理员才能修改,全局是否记录慢查日志
log_slow_rate_limit=1  
    记录速率
log_slow_verbosity 
    是否记录详细的慢查日志

错误日志:

1.服务器启动和关闭过程中的信息;
2. 服务器运行过程中的错误信息;
3. 事件调度器运行一个事件时产生的信息;
4. 在复制架构中的从服务器上启动从服务器线程时产生的信息;
log_error = /path/to/error_log_file
     直接指向日志文件
log_warnings = {1|0}
     是否记录警告信息于错误日志中;

中继日志:

从主服务器复制了来的二进制日志


二进制日志:有以下用途

1.引起mysql服务器改变的任何操作。
2.复制功能依赖于此日志。
3.从服务器通过复制主服务器的二进制日志完成主从复制,在执行之前保存于中继日志中。 
4.从服务器通常可以关闭二进制日志以提升性能。
5.主要用于时间点恢复
5.数据库复制


本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1785711

以上是关于关系型数据库之Mysql引擎-日志-用户管理的主要内容,如果未能解决你的问题,请参考以下文章

关系型数据库之Mysql二进制日志管理

《MySQL系列-InnoDB引擎14》文件-日志文件-错误日志

《MySQL系列-InnoDB引擎14》文件-日志文件-错误日志

MySQL——innodb日志管理

mysql优化之执行计划

MySQL之日志管理