mysql介绍(myisam)

mysql引擎

常用的mysql引擎有myisam、innodb。很多人不知道还有 Memery ,Archive,Ndb等

在这里详细介绍myisam的特性
下表是MyISAM 的功能
mysql介绍(myisam)_第1张图片

每个myisam表都有三个文件:.frm(储存表结构) .myd(储存数据) .myi(储存索引)
在 MySQL 5.7,默认引擎是innodb,如果要使用myisam,需要指定 engine=myisam。

myisam具有如下特点:

1、所有数据值都以低字节优先存储。 这使得数据机和操作系统独立。 二进制可移植性的唯一要求是,机器使用二进制补码有符号整数和IEEE浮点格式。 这些要求广泛应用于主流机器。 二进制兼容性可能不适用于嵌入式系统,有时具有特殊的处理器。存储数据低字节优先没有显着的速度代价; 表行中的字节通常是不对齐的,并且按顺序读取未对齐字节比按相反顺序进行更少的处理。 此外,服务器中提取列值的代码与其他代码相比不是时间关键的。

2、 所有数字键值都以高字节先存储,以允许更好的索引压缩。
3、支持大文件的文件系统(最多63位文件长度)。
4、在MyISAM表中有 (2^32)^2(1.844E + 19)行的限制。
5、每个MyISAM表的最大索引数为64。每个索引的列数上限为16。
6、当按照排序顺序插入行时(如使用AUTO_INCREMENT列时),索引树被拆分,以便高节点只包含一个键。 这提高了索引树中的空间利用率。
7、支持每个表一个AUTO_INCREMENT列的内部处理。 MyISAM自动更新此列以进行INSERT和UPDATE操作。 这使AUTO_INCREMENT列更快(至少10%)。 序列顶部的值在删除后不会重复使用。 (当AUTO_INCREMENT列被定义为多列索引的最后一列时,将重复使用从序列顶部删除的值。)AUTO_INCREMENT值可以使用ALTER TABLE或myisamchk重置。
8、 当使用更新、删除和插入混合操作时,动态大小的行的碎片要少得多。 这是通过自动组合相邻的已删除块以及通过扩展块(如果删除下一个块)来完成的。
9、 MyISAM支持并发插入:如果表在数据文件中间没有可用块,则可以在其他线程从表中读取的同时,向其中插入新行。 由于删除行或更新具有比当前内容更多的数据的动态长度行,可能会发生空闲块。 当所有空闲块都用尽(填充)时,将来的插入将再次变为并行。
10 、可以将数据文件和索引文件放在不同物理设备上的不同目录中,以获得更高的速度,使用DATA DIRECTORY和INDEX DIRECTORY表选项到CREATE TABLE。
11 、 BLOB和TEXT列可以建立索引。
12 、索引列中允许NULL值。 每个键需要0到1个字节。
13 、每个字符列可以有不同的字符集。
14 、在MyISAM索引文件中有一个标志,指示表是否正确关闭。 如果mysqld使用–myisam-recover-options选项启动,则MyISAM表在打开时会自动检查,如果表未正确关闭,则会进行修复。
15、 myisamchk –analyze存储键的部分以及整个键的统计信息。
16、 myisampack可以包装BLOB和VARCHAR列。
17、 支持一个真正的VARCHAR类型; 一个VARCHAR列以一个或两个字节存储的长度开始。
18、 具有VARCHAR列的表可以具有固定或动态行长度。
19、 表中VARCHAR和CHAR列的长度总和可能高达64KB。
20、 任意长度UNIQUE约束。

MyISAM表存储格式

MyISAM支持三种不同的存储格式。 其中两个,固定和动态格式,根据您使用的列的类型自动选择。 第三种压缩格式只能使用myisampack实用程序创建
对没有BLOB或TEXT列的表使用CREATE TABLE或ALTER TABLE时,可以使用ROW_FORMAT表选项将表格格式强制为FIXED或DYNAMIC。

静态(固定长度)表特性
1 静态格式是MyISAM表的默认值。 当表不包含可变长度列(VARCHAR,VARBINARY,BLOB或TEXT)时使用。 每行使用固定数量的字节存储。
2 在三种MyISAM存储格式中,静态格式是最简单和最安全的(最少受到损坏)。 它也是最快的磁盘格式,因为可以轻松地在磁盘上找到数据文件中的行:要根据索引中的行号查找行,请将行号乘以行长 以计算行位置。 此外,当扫描表时,在每次磁盘读取操作时很容易读取恒定数量的行。
3 固定长度行格式仅适用于没有BLOB或TEXT列的表。 使用带有显式ROW_FORMAT子句的这些列创建表不会引发错误或警告; 格式规范将被忽略。
4 CHAR和VARCHAR列以空格填充到指定的列宽,尽管列类型不更改。 BINARY和VARBINARY列用0x00字节填充到列宽。
5 NULL列在行中需要额外的空间来记录它们的值是否为NULL。 每个NULL列需要一个额外的位,向上舍入到最接近的字节。
6 很快。
7 容易缓存。
8 易于在崩溃后重建,因为行位于固定位置。
9 重组是不必要的,除非您删除了大量的行,并希望将可用磁盘空间返回到操作系统。 为此,请使用OPTIMIZE TABLE或myisamchk -r。
10 通常需要比动态格式表更多的磁盘空间。
动态表特性
1 如果MyISAM表包含任何可变长度列(VARCHAR,VARBINARY,BLOB或TEXT),或者表是使用ROW_FORMAT = DYNAMIC表选项创建的,则使用动态存储格式。
2 动态格式比静态格式复杂一点,因为每一行都有一个标题,表示它有多长。 当由于更新而变长时,行可能变得碎片化(以不连续的片段存储)。
3 可以使用OPTIMIZE TABLE或myisamchk -r对表进行碎片整理。 如果具有在包含一些可变长度列的表中访问或更改的固定长度的列,最好将可变长度列移动到其他表,以避免碎片。
4 所有字符串列都是动态的,除非长度小于4。
5 每行前面都有一个位图,指示哪些列包含空字符串(对于字符串列)或零(对于数字列)。 这不包括包含NULL值的列。 如果字符串列在删除尾部空格后的长度为零,或者数值列的值为零,则会在位图中标记,而不会保存到磁盘。 非空字符串保存为长度字节加上字符串内容。
6 NULL列在行中需要额外的空间来记录它们的值是否为NULL。 每个NULL列需要一个额外的位,向上舍入到最接近的字节。
7 通常比固定长度表需要更少的磁盘空间。
8 每行仅使用所需的空间。 但是,如果行变大,则会将其拆分为所需的数量,从而导致行碎片。 例如,如果使用扩展行长度的信息更新行,则行会变成碎片。 在这种情况下,您可能需要不时运行OPTIMIZE TABLE或myisamchk -r以提高性能。 使用myisamchk -ei获取表统计信息。
9 比静态格式表更难以在崩溃后重建,因为行可能被分段成许多块,链接(片段)可能会丢失。

MyISAM表问题

MySQL用于存储数据的文件格式已经过广泛测试,但总是存在可能导致数据库表损坏的情况。 以下讨论描述了这种情况如何发生以及如何处理它。
出现损坏表的原因:
1 mysqld进程在写入的中间被杀死。
2 生意外的计算机关机(例如,计算机关闭)。
3 硬件故障。
4 您正在使用外部程序(例如myisamchk)来修改服务器正在同时修改的表。
5 MySQL或MyISAM代码中的一个bug错误。
损坏表的典型症状如下:
1 从表中选择数据时出现以下错误
Incorrect key file for table: '...'. Try to repair it
>
2 表没有正确关闭的问题
每个MyISAM索引文件(.MYI文件)在标题中都有一个计数器,可用于检查表是否已正确关闭。 如果从CHECK TABLE或myisamchk获得以下警告,则表示此计数器已不同步:
clients are using or haven't closed the table properly

此警告不一定意味着表已损坏,但应至少检查表。
只有在这些条件下,计数器才会变得不正确:
复制MyISAM表,而不首先发出LOCK TABLES和FLUSH TABLES。
MySQL在更新和最后关闭之间崩溃。
表被myisamchk –recover或myisamchk –update-state修改,同时它被mysqld使用。
多个mysqld服务器正在使用该表,并且一个服务器在表由另一个服务器使用时对其执行REPAIR TABLE或CHECK

mysql的配置

MySQL是如何使用内存的
MySQL性能模式是一种用于以低级别监视MySQL服务器执行的功能。 从MySQL 5.7开始,性能模式会逐步动态分配内存,将其内存使用扩展到实际的服务器负载,而不是在服务器启动期间分配所需的内存。 一旦分配内存,在服务器重新启动之前不会释放内存。

对于打开的每个MyISAM表,索引文件将打开一次; 对于每个并发运行的线程,数据文件打开一次。 对于每个并发线程,分配表结构,每个列的列结构和大小为3 * N的缓冲区(其中N是最大行长度,不计算BLOB列)。 BLOB列需要五到八个字节加上BLOB数据的长度。 MyISAM存储引擎维护一个额外的行缓冲区供内部使用。

所有线程共享相同的基本内存。

当不再需要线程时,分配给它的内存被释放并返回到系统,除非线程返回到线程高速缓存中。 在这种情况下,内存保持分配。
myisam_use_mmap系统变量可以设置为1,以便为所有MyISAM表启用内存映射。

所有连接查询都在单次传递中执行,并且大多数连接可以在不使用临时表的情况下完成。 大多数临时表是基于内存的哈希表。 具有大行长度(计算为所有列长度的总和)或包含BLOB列的临时表存储在磁盘上。

几乎所有的解析和计算都是在线程本地和可重用的内存池中完成的。 小项目不需要内存开销,因此避免了正常的缓慢内存分配和释放。 内存只分配给意外的大字符串。

对于具有BLOB列的每个表,缓冲器被动态地放大以读取较大的BLOB值。 如果扫描表,将分配与最大BLOB值一样大的缓冲区。

MySQL还需要为表定义缓存提供内存。 table_definition_cache系统变量定义可以存储在表定义高速缓存中的表定义(来自.frm文件)的数量。 如果使用大量表,则可以创建大型表定义高速缓存以加快表的打开速度。 表定义缓存占用较少的空间,不使用文件描述符,与表缓存不同。

FLUSH TABLES语句或mysqladmin flush-tables命令会关闭所有未同时使用的表,并在当前正在执行的线程完成时将所有正在使用的表标记为关闭。 这有效地释放了大多数使用中的内存。 FLUSH TABLES不会返回,直到所有表都已关闭。

用于管理客户端连接的每个线程都使用一些线程特定的空间。 以下列表指示这些和哪些变量控制它们的大小:
key_buffer_size
所有线程共享MyISAM密钥缓冲区; 其大小由key_buffer_size变量确定。 服务器使用的其他缓冲区根据需要分配。
thread_stack
堆栈

net_buffer_length

连接缓冲区/结果缓冲区(连接缓冲区和结果缓冲区每个以等于net_buffer_length字节的大小开始,但是根据需要被动态地放大到max_allowed_packet字节。 每个SQL语句后,结果缓冲区缩减为net_buffer_length个字节。 当一个语句运行时,还分配当前语句字符串的副本。)在MySQL 5.7.4之前,如果性能模式使用语句检测编译,则每个会话为1024字节。 在5.7.4和5.7.5中,每个会话1024字节。 在5.7.6和更高版本中,每个会话的max_digest_length字节。
所有线程共享相同的基本内存。

read_buffer_size

执行表的顺序扫描的每个请求都会分配一个读缓冲区

read_rnd_buffer_size

当以任意序列(例如,排序后)读取行时,可以分配随机读缓冲器( read_rnd_buffer_size)以避免盘寻道。

internal_tmp_disk_storage_engine

如果内部内存临时表变得太大,MySQL会通过将表从内存中更改为磁盘格式来自动处理,由internal_tmp_disk_storage_engine定义的存储引擎处理。 可以增加允许的临时表大小。大多数执行排序的请求根据结果集大小分配排序缓冲区和0-2个临时文件。

table_open_cache

MySQL需要内存和表缓存的描述符。 所有使用中的表的处理程序结构都保存在表缓存中,并作为“先进先出”(FIFO)管理。 初始表缓存大小由table_open_cache系统变量定义

table_definition_cache

MySQL还需要为表定义缓存提供内存。 table_definition_cache系统变量定义可以存储在表定义高速缓存中的表定义(来自.frm文件)的数量。 如果使用大量表,则可以创建大型表定义高速缓存以加快表的打开速度。 表定义缓存占用较少的空间,不使用文件描述符,与表缓存不同。

你可能感兴趣的:(mysql)