存储引擎的分类
存储引擎概述
存储引擎是如何存储数据,如何为存储的数据建立索引和如何更新,查询数据等技术的实现方法。InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。创建新表时在不指定存储引擎的情况下,系统会默认使用存储引擎,mysql5.5之前默认的是MyISAM,5.5之后改为InnoDB。在Oracle和sql Server等数据库中只有一种存储引擎,所以数据存储和管理机制是一样的,而mysql数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎。mysql的核心就是存储引擎。
mysql中有哪些存储引擎
mysql存储引擎分为事务型存储引擎和非事务型存储引擎。
其实InnoDB和BDB属于事务型存储引擎。
MyISAM
mysql5.0之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务。表级锁定:数据更新时,会锁定整张表。占用资源少,性能高。写入性能弱。
InnoDB
可以看作是对MyISAM类型的进一步更新产品。它提供了事务,行级锁机制和外键约束功能。
BDB
事务性数据库的另一种选择,支持Commit和Rollback等其他事务特性。
- Commit:提交事务。
- Rollback:回滚事务,与Commit相反。
Memory
这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
archive
这种类型只支持select和insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。
MyISAM Merge
这种类型是MyISAM的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常用于日志和数据仓库。
Federated
将不同的mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用。
Cluster/NDB
高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用。
CSV
逻辑上由逗号分割数据的存储引擎。CSV存储引擎不支持索引。
BlackHole
黑洞引擎。写入的任何数据都会消失,一般用于记录binlog做复制的中继。
EXAMPLE
是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。
与引擎相关的操作
查看数据库可以支持的存储引擎
show engines;
查看表的定义结构等信息
Desc[ribe] tablename;
显示表的创建语句
show create table tablename;
显示表的当前状态值
show table status like ‘tablename’\G
设置和修改表的存储引擎
create table tableName(
colnumName(列名1) type(数据类型) attri(属性设置),
colnumName(列名2) type(数据类型) attri(属性设置),…)engine=engineName
常用存储引擎的对比
常用存储引擎的对比
Innodb引擎:提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计目标就是处理大数据容量的数据库系统。
MyISAM引擎:不提供事务的支持,也不支持行级锁和外键。
MEMORY引擎:所有的数据都在内存中,数据处理速度快,但是安全性不高。
前面三种常用存储引擎进行对比:
特性 | MyISAM | InnoDB | MEMORY |
存储限制 | 256TB | 64TB | RAM |
事务 | 不支持 | 支持 | 不支持 |
锁机制 | 表级锁 | 行级锁 | 表级锁 |
外键 | 不支持 | 支持 | 不支持 |
B数索引 | 支持 | 支持 | 支持 |
哈希索引 | 不支持 | 支持 | 支持 |
全文索引 | 支持 | 支持 | 不支持 |
索引缓存 | 支持 | 支持 | 支持 |
事务是一组具有原子性的SQL语句,或是一个独立的工作单元。
事务的ACID是指其的原子性,一致性,隔离性,持久性
- 原子性:事务中各项操作要么全做要么全不做。任何一项操作的失败都会导致整个事务的失败
- 一致性:事务结束后系统状态是统一的
- 隔离性:并发执行的事务彼此无法看到对方的中间状态
- 持久性:事务完成后所做的改动都会被持久化
MyISAM和InnoDB引擎的详细对比:
MyISAM
MyISAM引擎是MySQL5.1及之前版本的默认引擎,它的特点是:
- 不支持行锁,读取和写入时都需要对表进行加锁
- 不支持事务
- 不支持外键
- 不支持崩溃后的安全恢复
- 在表有读取查询的同时,支持往表中插入新纪录
- 支持全文索引
- 对于不会进行修改的表,支持压缩表来减少空间占用
InnoDB
InnoDB在MySQL5.5后成为默认索引,它的特点是:
- 支持行锁,采用MVCC来支持高并发(MCAA是一种并发控制的方法)
- 支持事务
- 支持外键
- 支持崩溃后的安全恢复
- 不支持全文索引
总结:MyISAM适合select密集型的表,而InnoDB适合insert和update密集型的表。
MyISAM对比InnoDB为什么不支持事务
因为MyISAM存储引擎没有redo和undo文件,没有支持事务的ACID特性,锁也只有表锁。
- redo:记录数据库变化的日志
- undo:数据库为了保持读一致性,存储历史数据在一个位置
MyISAM和InnoDB存储索引区别
在存储索引结构上最大的区别其实就是聚集索引和非聚集索引的区别。
MyISAM的索引
MyISAM的索引与行记录是分开存储的,是非聚集索引。
其主键索引与普通索引没有差异
- 有连续聚集的区域单独存储行记录
- 主键索引的叶子节点,存储主键,与对应行记录的指针
- 普通索引的叶子节点,存储索引列,与对应行记录的指针
主键索引与普通索引是两颗独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。
InnoDB的索引
InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引。
- 没有单独区域存储行记录
- 主键索引的叶子节点,存储主键与对应行记录
- 普通索引的叶子节点存储主键
所以,InnoDB的查询是非常快的,但是不建议用较长的列做主键。
因为物理磁盘的关系,聚集索引只能有一个。
InnoDB的普通索引可以有多个,它与聚集索引不同,普通索引的叶子节点,存储主键。
总结
MyISAM和InnoDB都使用B+树来实现索引。
- MyISAM的索引与数据分开存储
- MyISAM的索引叶子存储指针,主键索引与普通索引无太大区别
- InnoDB的聚集索引和数据行统一存储
- InnoDB的聚集索引存储数据行本身,普通索引存储主键
- InnoDB一定有且只有一个聚集索引
- InnoDB建议使用趋势递增整数作为PK,而不宜使用较长的列作为PK
锁
锁的简介
锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性,有效性。
如何加锁
MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显示加锁。
显示加锁
上共享锁(读锁)的写法:lock in share mode,例如:
select math from zyk where math>60 lock in share mode;
上排它锁(写锁)的写法:for update,例如:
select math from zyk where math>60 for update;
行锁,表锁,页锁
- 行级锁:是mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大(因为它要精细到哪一行,而表锁直接锁定就行)。行级锁分为共享锁和排他锁。
- 表级锁:是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗少,被大部分mysql引擎支持。
- 页级锁:是mysql中锁定粒度介于行级和表级中间的一种锁。表级锁速度快但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
Mysql的数据库管理
密码管理
mysql默认安装的时候是没有给出相应的初始化密码的,但是可以通过手动改设来进行初始化密码。
设置初始化密码:
mysqladmin -uroot password 1234567
修改密码:
mysqladmin -u root -p1234567 password 123456
注:-p之后要直接连接密码,不能出现空格
库管理
对数据库的创建
create database 新建数据库名;
对数据库的查看
show databases;
对数据库的删除
drop database 删除数据库名;
表管理
查看所有表语句
show tables;
查看表结构
Desc tablename;
删除表
Drop table tablename;
在表中添加/删除字段
alter table tablename add/drop column 字段名;
修改表名称
alter table 旧表名 rename to 新表名;
在表中插入数据
INSERT INTO USER VALUES(…,…,…,…);
在表中插入列
ALTER TABLE tablename ADD COLUMN 新列名 数据类型;
查询某些字段
SELECT 字段名FROM 表名;
查询表中所有字段
SELECT * FROM USER;
查询表中有效行数
SELECT COUNT(*)FROM tablename;
数据管理
添加数据
insert into 表名 values(“数据”);
修改数据
update 表名 set 设置项 条件
删除数据
delete from 表名 where 条件
查询数据
select 字段 from 表名 where 条件
用户管理
用户授权
mysql> grant all privileges on *.* to ‘zyk’@’%’ identified by ‘123456’ with grant option;
- all privileges:表示将所有权限授予给用户。也可用SELECT,CREATE,DROP来指定具体的权限。
- on:表示这些权限对哪些数据库和表生效。
- to:将权限授予哪个用户。%表示没有限制,在任何主机都可以登录。比如:“zyk”@”192.168.1.%”,表示zyk这个用户只能在192.168.1IP段登录。
- identified by:指定用户的登录密码。
- with grant option:表示允许用户将自己的权限授权给其它用户。
注意:可以使用GRANT给用户添加权限,权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个SELECT权限,后来又给用户添加了一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。
刷新权限
对用户做了权限变更之后,一定记得重新加载一下权限,将权限信息从内存中写入数据库。
flush privileges;
查看用户权限
show grants for ‘root’@’localhost’;
回收权限
删除zyk这个用户的create权限,该用户将不能创建数据库和表。
revoke create on *.* from ‘zyk@localhost’;
flush privileges;
删除用户
drop user ‘zyk’@’localhost’;
用户重命名
rename user ‘test3’@’%’ to ‘test1’@’%’;
数据备份
使用mysqldump命令备份
mysqldump命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。
mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。
- 备份一个数据库
mysqldump -u username -p dbname table1 table2 …->BackupName.sql
dbname参数表示数据库的名称。
table1和table2参数表示需要备份的表的名称,为空则整个数据库备份。
BackupName.sql参数表设计备份文件的名称,文件名前面可以加一个绝对路径。
例:
使用root用户备份zyk数据库下的yk36表
mysqldump -u root -p yk36 ZYK > D:\backup.sql - 备份多个数据库
mysqldump -u username -p –databases dbname1 dbname2 > Backup.sql
加上 –databases选项,后面可以跟多个数据库。 - 备份所有数据库
mysqldump命令备份所有数据库的语法如下:
mysqldump -u username -p -all-databases > BackupName.sql
直接复制整个数据库目录
mysql有一种非常简单的备份方法,就是将mysql中的数据库文件直接复制出来。这是最简单,速度最快的方法。
不过在此之前,要先将服务器停止,这样才可以保证在复制期间数据库的数据不会发生变化。这种情况在开发环境可以,但是在生产环境中很难允许备份服务器。
使用mysqlhotcopy工具快速备份
此种方法属于热备份。所有mysqlhotcopy支持不停止MySQL服务器备份。而且,mysqlhotcopy的备份方式比mysqldump快。mysqlhotcopy是一个perl脚本,主要在Linux系统下使用。
原理:先将需要备份的数据库加上一个读锁,然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,最后把需要备份的数据库文件复制到目标目录。
mysqlhotcopy [option] dbname1 dbname2 backupDir/
dbname:数据库名称
backupDir:备份到哪个文件夹下
数据还原
还原使用mysqldump命令备份的数据库
语法如下:
mysql -u root -p [dbname] < backup.sq
还原直接复制目录的备份
通过这种方式还原时,必须保证两个MySQL数据库的版本号是相同的。MyISAM类型的表有效,对于InnoDB类型的表不可用,InnoDB表的表空间不能直接复制。
mysql索引和存储过程
什么是索引
在数据库表中,对字段建立索引可以大大提高查询速度。可以令mysql的查询和运行更加高效。
常见索引分类:
主键索引(primary key):主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的每一条记录。
唯一索引(unique):唯一索引指的是索引列的所有值都只能出现一次,必须唯一。
普通索引(index):最常见的索引,作用就是加快对数据的访问速度。
各种索引的语法格式
主键索引的语法格式
创建表的时候直接添加主键索引
create table 表名(
字段名 类型 PRIMARY KEY,
);
修改表结构时添加主键索引
alter table 表名 add primary key(字段名);
唯一索引的语法格式
创建表的时候直接添加唯一索引
create table 表名(
列名 类型,
UNIQUE 列名
);
修改表结构时添加索引
alter table 表名 add UNIQUE(列名);
普通索引的语法格式
使用create index语句创建:
create index 索引名 on 表名(列名);
修改表结构添加索引
alter table 表名 add index 索引名(列名);
删除索引
删除唯一索引和普通索引语法格式:
alter table 表名 drop index 索引名;
删除主键索引格式:
alter table 表名 drop primary key;
索引的优缺点
添加索引应该考虑在where及order by涉及的列上建立索引。
索引的优点:
- 大大的提高查询速度
- 可以显著的减少查询中分组和排序的时间
索引的缺点:
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 当对表的数据进行增删改查时,索引也要同时进行维护,降低了数据的维护速度
什么是存储过程
存储过程其实就是一堆SQL语句的合并,中间加入了一些逻辑控制。
优缺点:
优点:
- 存储过程一旦调试完成就可以稳定运行
- 使数据库交互更加快捷
缺点:
- mysql的存储过程与oracle相比较弱
- 移植和维护比较困难
创建存储过程
创建存储过程语法:
DELIMITER $$ #声明语句结束符,一般使用$$
CREATE PROCEDURE 过程名称(IN 参数名 参数类型) #声明存储过程,IN输入参数:表示调用者向存储过程传入值。
BEGIN --开始编写存储过程
--要执行的操作
END $$ --存储过程结束
调用存储过程的语法格式:
call 存储过程名;
应用实例:
定义两张表:商品表和订单表:
向商品表中添加三条数据:
编写存储过程:
mysql主从同步
mysql主从同步简介
当master主库的数据发生变化时,变化会实时同步到slave从库。
master-slave模式,主机是数据入口,通过bin-log同步给从机,实现数据备份的功能,从而达到在主机宕机的时候,可以立刻人工切换从机恢复业务。
主从同步的好处
- 水平扩展数据库的负载能力
- 容错,高可用
- 数据备份
主从同步的原理
master-slave的体系结构
如下图:
不管是delete,update,insert,还是创建函数,存储过程,所有的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。
主从同步事件有3种形式:statement,row,mixed。
- statement:会将对数据库操作的sql语句写入到binlog中。
- row:会将每一条数据的变化写入到binlog中。
- mixed:statement与row混合。mysql来决定什么时候写statement格式的,什么时候写row格式的binlog。
binlog dump线程
当slave连接到master的时候,master机器会为slave开启binlog dump线程。当master的binlog发生变化时,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。
在slave机器上的操作
当主从同步开启的时候,slave上会创建2个线程。
- I/O线程。该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。
- SQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。
配置实验
配置主服务器
- 编辑主节点配置文件,启用二进制日志文件
- 查看二进制日志是否开启
show global variables like ‘%log%’;
- 查看主节点的server id
show global variables like ‘%server%’;
4.5.1.4.在主节点上创建有复制权限的用户
到这里主服务器的配置完成。
配置从服务器
4.5.2.1.编辑从节点配置文件,开启中继日志
4.5.2.2.查看中继日志是否开启
4.5.2.3.查看server相关信息
4.5.2.4.配置从节点访问主节点的信息
4.5.2.5.启动复制线程
至此,从服务器配置完成。
查看从机是否与主机同步
主要是看slave状态中的salve_IO和salve_SQL是否是yes。
上诉主从服务器配置完后,在mysql命令行输入命令:
show slave status\G
如何会出现IO和SQL线程都为YES,则通过
Binlog知识
binlog介绍
binlog是mysql的二进制日志,是mysql最重要的日志,它记录了所有的DDL和DML语句,以事件形式记录,还包含语句所执行的消耗的时间,mysql的二进制日志是事务安全型的。binlog的主要目的是复制和恢复。
四类数据语言:
- DDL:数据定义语言,主要是用于定义和改变表的结构,数据类型,表之间的链接等操作。
- DML:数据操纵语言,主要是对数据进行增删改查等。
- DQL:数据查询语言,主要是对数据进行查询操作。
- DCL:数据控制语言,主要是用来设置/更改数据库用户权限。
以事件形式记录:就是binlog的内容都是一个个的事件。(事件就是用户对窗口上各种组件的操作)
binlog配置
查看binlog日志的状态
登录mysql后,输入:
show variables like ‘%log_%’;
查看到binlog日志为OFF关闭状态。
开启mysql binlog日志
退出mysql,然后修改mysql的my.cnf配置文件:
- server-id:单个节点的id,这里由于只有一个节点,所以可以把id随机指定为一个数,这里将id设置成1。若集群中有多个结点,则id不能相同。
- log-bin:是指定binlog日志文件的名字为mysql-bin,以及其存储路径。
重启MySQL
每次数据库重启,服务器会调用flush logs;新创建一个binlog日志。
此时再次进入MySQL,查看binlog日志的状态。显示binlog日志为ON开启状态,开启成功。
binlog恢复数据实验
binlog的三种模式
- statement:记录每一条修改数据的sql
优点:日志文件比较小,节约io操作,性能较好。
缺点:只记录执行语句,所以还需要保证在主从执行的得到相同的结果。所以准确性差。 - row:保存被修改的记录
优点:准确性强。
缺点:日志文件比较大。 - mixed:兼顾前两者的优点
准备一个原始表
新建一个表,里面初始有4条测试数据。
Flush logs并查当前日志
然后,先在mysql中,执行:flush logs;把之前的记录截断掉,在通过命令show master logs;查看下当前的日志:
mysql-bin.000005也就是我们刚生成的日志文件。
插入并模拟删除记录
这个时候我们去操作表数据,先给这张表插入一条数据。
这个时候里面会多出一个DiDi的记录,这时候,我们模拟误操作,把DiDi的记录直接删除。
下面进行数据的恢复
flag logs并执行mysqlbinlog命令
回到mysql,继续执行flush logs;然后查看日志,这时候文件5已经被截断了,它就不会再增加新的日志了,这样就保证了我们恢复的时候,不会受影响。
然后去到服务器,执行命令:
mysqlbinlog --no-defaults /usr/local/mysql/var/mysql-bin.000005;
由图中可以看出,我们在174的时候进行了数据的插入,在366的时候我们删除了DiDi这条记录,at表示的其实就是pos位置。
然后执行核心的恢复操作的命令:
start-position表示恢复起始点,stop-position表示恢复结束点。
注意:起始点和结束点要定在插入前和删除前,要不然是恢复不了数据的。
其它情况下,还可以指定开始时间和结束时间来恢复数据。
恢复成功
执行完上述命令之后,就可以看到DiDi这条数据恢复成功。
mysql的定时备份
创建备份目录
把备份文件放在/data/backup/mysql下面,把脚本放在/data/backup下面
创建文件夹:
mkdir -p /data/backup/mysql
cd /data/backup
创建脚本文件
创建mysql_backup.sh
vi mysql_backup.sh
并写入脚本文件:
新建配置文件/data/backup/my_mysql.cnf:
对脚本进行可执行权限的添加:
chmod +x ./mysql_backup.sh
导出
使用下面命令进行导出:
sh ./mysql_backup.sh
ll ./mysql
导出之后:
mysql配置性能优化
数据库优化的目的
- 减少页面访问错误
- 提高数据库稳定性
- 提高用户体验
配置优化
max_connections
mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连接提供缓冲区,就会开销的越多。
如果max_used_connections跟max_connections相同那就是max_connections设置过低或者超过服务器的负载上限。
back_log
mysql能暂存的连接数量,当主要mysql线程在一个很短时间内得到非常多的连接请求时它就会起作用,如果mysql的连接数据达到max_connections时候,新来的请求将会被存在堆栈中,等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
wait_timeout和interactive_timeout
wait_timeout:指的是mysql在关闭一个非交互的连接之前所要等待的秒数。
指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
Interactive_timeout:指的是mysql在关闭一个交互的连接之前所需要等待的秒数。
如果超时了,就会自动断开,默认是28800,可调优为7200。
key_buffer_size
指定用于索引的缓冲区大小,可以对读写加速,但是也不宜设置过大,对于内存在4GB左右的服务器该参数可设置为384M或512M。参数值过大会使整个服务器效率降低。
query_cache_size
指定用于查询缓冲,mysql将查询结果存放在缓冲区中,今后对于同样的select语句,将直接从缓冲区中读取结果。
sort_buffer_size
查询排序时所能使用的缓冲区大小。该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100*4=400MB。所以,对于内存在4GB左右的服务器推荐设置为4-8M。
max_allowed_packet=32M
mysql根据配置文件会限制,server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet参数限制,导致写入或者更新失败,更大值是1GB,必须设置1024的倍数。
join_buffer_size=2M
用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个人连接独享。
bulk_insert_buffer_size=64M
批量插入数据缓存大小,可以有效提高插入效率,默认为8M。
MySQL的慢日志
慢查询日志概念
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
慢查询日志相关参数
slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭
slow-query-log-file:MySQL数据库慢查询日志存储路径。可以不设置参数,系统则会默认给一个缺省的文件host_name-slow.log
long_query_time:慢查询阀值,当查询时间多余设定的阀值时,记录日志
log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中
log_output:日志存储方式
慢查询日志配置
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_long的值来开启:
set global slow_query_log=1;
使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf:
slow_query_log=1;
slow_query_log_file=/tmp/mysql_slow.log
日志分析工具mysqldumpslow
在生产环境中,如果要手工分析日志,查找,分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow
mysqldumpslow [OPTS…] [OPTS…]
-s,是表示按照何种方式排序
c:访问计数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感
例:
得到返回记录集最多的10个SQL。
mysqldumpslow -s r -t 10 /database/mysql/mysql_slow.log
得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql_slow.log
得到按照时间排序的前10条里面含有左连接的查询语句。
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql_slow.log