热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

MySQL锁机制相对其他数据库而言,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;

wKiom1c1IEXxCQcwAAF8PDcM6Fk499.jpg

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

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

wKiom1c1H6ew_kYGAAX3xezi4Qs821.jpg

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

wKiom1c1II_Qn_0sAAY7mQjttfQ267.jpg


案例演示之写锁:

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

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

wKioL1c1JArwniFNAAYzjcBHIXo856.jpg

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

wKioL1c1JFfzDOkqAAS76MSJt-A756.jpg


表引擎必须是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;


wKioL1c1Q-eihTluAAeqRkA9XXQ720.jpg

B更新数据:
客户端B: 

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

wKiom1c1Q-fyn9c-AAB719Cvr5I085.png

客户端A:

wKioL1c1RZqS_lPEAACp570saWI352.png

经过上面的实验可以得出结论,事务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;

wKioL1c1Y86QWKfCAAfw2ulstyY593.jpg

B更新数据:
客户端B:

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


wKioL1c1ZDrTw0RhAAcj9O_8WTk980.jpg

客户端A:

wKiom1c1ZW7zsNJDAAC_z-PPd4k342.png

   经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务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;

wKiom1c1asKTmTTuAAedTkRur9o333.jpg

B更新数据:
客户端B:

wKioL1c1bQWwsy0WAAciM40NAjg785.jpg

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

(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/

wKiom1dJA1rjtqlCAAdHAvqvkKU407.jpg

(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/datainnodb_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/mysqldatadir=/mydata/data

加入服务列表启动服务:

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

(6)提供PATH环境变量

# vim /etc/profile.d/mysqldPATH=/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: 624Max_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.用户格式:

username@{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_namemysql> RENAME USER old_user TO new_usermysql> 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 username@'hostname';mysql> SHOW GRANTS FOR root@'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):

SSLX509:证书格式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


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
author-avatar
手机用户2502913375
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有