认识 MySQL物理文件


本文摘自PHP中文网,作者coldplay.xixi,侵删。

mysql教程栏目介绍MySQL物理文件。

1.数据库的数据存储文件

MySQL 数据库会在data目录下面建立一个以数据库为名的文件夹,用来存储数据库中的表文件数据。不同 的数据库引擎,每个表的扩展名也不一样 ,例如: MyISAM 用“ .MYD ”作为扩展名, Innodb 用 “.ibd” , Archive 用 “.arc” ,CSV 用 “.csv“。

1. ".FRM"文件

8.0之前无论是那种存储引擎,创建表之后就一定会生成一个以表明命名的'.frm'文件。frm文件主要存放与表相关的数据信息,主要包括表结构的定义信息。当数据库崩溃时,用户可以通过frm文件来恢复数据表结构。

2. ".MYD"文件

“.MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个“.MYD”文件与 之对应,同样存放于所属数据库的文件夹 下, 和“.frm”文件在一起。

3. ".MYI"文件

“.MYI”文件也是专属于MyISAM存储引擎的,主要存放MyISAM表的索引相关信息。对于MyISAM存储来说, 可以被cache 的内容主要就是来源 于“.MYI”文件中。 每一个MyISAM表对应一个“.MYI”文件,存放于位置 和“.frm”以及“.MYD”一样。

4. ".ibd"文件与".ibdata"文件

这两种文件都是存放 Innodb 数据的文件,之所以有两种文件来存放Innodb的数据(包括索引),是因为 Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件 ,文件存放在和MyISAM数据相同的位置。如果选用共享存储表空间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个 (或者多个,可自行配置)ibdata文件。

ibdata文件可以通过 innodb_data_home_dir(数据存放目录)和 innodb_data_file_path (配置每个文件的名称) 两个参数配置组成 innodb_data_file_path 中可以一次配置多个ibdata文件 #innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend 配置方式共享表空间以及独占表空间都是针对数据的存储方式而言的。

共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中。

独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有 一个.ibd文件。其中这个文件包括了 单独一个表的数据 内容以及索引内容。

4.1 两者对比

共享表空间:

优点: 可以放表空间分成多个文件存放到各个磁盘上。数据和文件放在一起方便管理。

缺点: 所有的数据和索引存放到一个文件中,多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日志系统这类应用最不适合用共享表空间。

独立表空间:

优点:

  1. 每个表都有自已独立的表空间。

  2. 每个表的数据和索引都会存在自已的表空间中。

  3. 可以实现单表在不同的数据库中移动。

  4. 空间可以回收

    a) Drop table 操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过: alter table TableName engine=innodb ;回收不用的空间。

    b) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 缺点:单表增加过大,如超过100 G。 相比较之下,使用独占表空间的效率以及性能会更高一点 共享表空间和独立表空间之间的转换。

1

2

3

4

5

show variables like "innodb_file_per_table"; ON代表独立表空间管理,OFF代表共享表空间管理;

修改数据库的表空间管理方式 修改innodb_file_per_table的参数值即可,但是修改不能影响之前已经

使用过的共享表空间和独立表空间;

innodb_file_per_table=1 为使用独占表空间

innodb_file_per_table=0 为使用共享表空间复制代码

2. 日志

日志文件:查询日志、慢查询日志、错误日志、事务日志、binlog日志、错误日志、中继日志

2.1 查询日志

查询日志在mysql中被称之为 general log(通用日志),不要被"查询日志"的名字误导,错误的以为查询日志只会记录select语句,其实不然,查询日志记录了数据库执行的命令,不管这些语句是否正确,都会被记录,我想这也是 general log 之所以"通用"的原因吧,由于数据库操作命令有可能非常多而且执行比较频繁,所以当开启了查询日志以后,数据库可能需要不停的写入查询日志,这样会增大服务器的IO压力,增加很多系统开销,所以默认情况下,mysql的查询日志是没有开启的,但是开启查询日志也有助于我们分析哪些语句执行密集,执行密集的select语句对应的数据是否能够被缓存,查询日志也可以帮助我们分析问题,所以,我们可以根据实际情况决定是否开启查询日志,如果需要可以手动开启。如果开启了查询日志,那么我们可以通过如下3种方式存储查询日志。

  • 方式1:将查询日志存放于指定的日志文件中。

  • 方式2:将查询日志存放于 mysql.general_log 表中。

  • 方式3:将查询日志同时存放于指定的日志文件与mysql库的general_log表中。

查看查询日志是否开启

1

show VARIABLES LIKE 'general_log';复制代码

image-20201022230113409

1

show variables where variable_name like "%general_log%" or variable_name="log_output";复制代码

image-20201022230653902

general_log:表示查询日志是否开启,ON表示开启,OFF表示未开启,默认为OFF

log_output:表示当查询日志开启以后,以哪种方式存放,log_output可以设置为4种值,"FILE"、"TABLE"、"FILE,TABLE"、"NONE"。

1

2

3

4

5

6

7

8

# 设置查询日志的输出方式

set global log_output=[none|file|table|file,table];

# 设置general log的日志文件路径

set global general_log_file='/tmp/general.log';

# 开启general log

set global general_log=on;

# 关闭general log

set global general_log=off;复制代码

2.2 慢日志

所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!

开启MySQL的慢查询日志功能

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 查看是否开启 未使用索引的SQL记录日志查询

show variables like 'log_queries_not_using_indexes';

# 开启 未使用索引的SQL记录日志查询

set global log_queries_not_using_indexs=on/off;

# 查看超过多长时间的查询记入慢查询日志中

show variables like 'long_query_time';

# 设置记录时长,0为全部记录,设置之后需重新启动

set global long_query_time=10

# 查看是否开启 mysql慢查询日志功能

show variables like 'slow_qurey_log'

# 开启、关闭慢日志

set global slow_qurey_log=on/off;

# 查看日志记录位置

show variables like 'slow_query_log_file';

#日志存储方式

show variables like "log_output";复制代码

  1. flie方式

select sleep(10) 执行完成查看日志

1

2

3

4

5

# Time: 2020-10-26T05:12:09.564006Z

# User@Host: root[root] @ localhost []  Id:    12

# Query_time: 10.000272  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1

SET timestamp=1603689119;

select sleep(10);复制代码

  1. table方式

    table方式查看MySQL慢日志

日志分析工具 mysqldumpslow

查看 mysqldumpslow 的帮助信息:

mysqldumpslow的帮助信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

-s ORDER     ORDER排序依据(al,at,ar,c,l,r,t),“at”是默认值

              al: 平均锁定时间

              ar: 平均发送行数

              at: 平均查询时间

               c: 计数

               l: 锁定时间

               r: 已发送行

               t: 查询时间 

-r           反转排序顺序(最大的最后一个而不是第一个)

-t NUM       只显示前n个查询

-a           不要将所有数字抽象为N,将字符串抽象为“S”

-n NUM       名字中至少有n个数字的抽象数字

-g PATTERN   grep: 只考虑包含此字符串的记录

-h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),

             default is '*', i.e. match all

-i NAME      name of server instance (if using mysql.server startup script)

-l           don't subtract lock time from total time复制代码

2.3 错误日志

错误日志(Error Log)是 MySQL 中最常用的一种日志,主要记录 MySQL 服务器启动和停止过程中的信 息、服务器在运行过程中发生的故障和异常情况等。

阅读剩余部分

相关阅读 >>

安装mysql后没有看到服务怎么办?

教你直接从mysql中将数据打印到文件中

mysql怎么查询某个表的外键约束?

mysql case when怎么使用?

怎么查看mysql版本

mac下如何重置mysql的root密码

mysql如何找回误删除数据

mysql如何和qt连接

mysql如何进行安装部署

mysql数据查询之子查询

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...