在MySQL中使用MyISAM
MyISAM是 MySQL 中最流行的存储引擎之一, MyISAM通常是继InnoDB之后的第二选择——在这篇博客文章中,我们将尝试找出如何最好地使用这个引擎。
什么是MyISAM?
MyISAM是MySQL的存储引擎之一。MyISAM基于ISAM(Indexed Sequential Access Method,索引顺序访问方法),这是IBM开发的一种索引算法,允许快速从大型数据集检索信息。然而,由于它的表锁定,在同时读取和写入一个表时,它做得不是很好。它也不支持事务。
对于一些MySQL工程师们来说,这个引擎是继InnoDB之后最受欢迎的选择:MyISAM存储引擎是MySQL在2005年提供的唯一一个存储引擎,已经使用了20多年。MyISAM是 MySQL 5.5版之前的默认存储引擎。
MyISAM内部原理
MyISAM内部工作原理的说明不在本博客的范围内,但我们可以为您提供有助于优化引擎性能的设置:
- Myisam_sort_buffer_size 定义通过运行REPAIR、CREATE INDEX或ALTER TABLE查询对索引进行排序时分配的缓冲区。
- Key_buffer_size 定义用于MyISAM表中索引块的缓冲区大小。增加此参数可以导致更好的索引处理。
- Sort_buffer_size 描述为需要执行排序操作的线程分配的缓冲区的大小。
- Read_buffer_size 描述为执行顺序扫描操作的线程分配的缓冲区大小。
- Write_buffer_size 描述写入缓冲区的大小。
这四个参数很重要,但尽管它们很重要,您也应该关注 key_buffer_size 变量。key_buffer_size 变量决定内存中保存的索引缓冲区的大小,可以将其视为 innodb_buffer_pool_size 对应项。如果服务器主要由 MyISAM 表组成,则可以将服务器上大约25%或更多的可用RAM分配给 key_buffer_size 变量。 还有另一种方法可以确定 key_buffer_size 参数的值应该是什么–只需比较 key_read_requests 值(读取索引的请求总数)和 key_reads 值(key_read的值是必须从磁盘读取的请求数)。可以通过查看服务器状态变量来检索这些参数的值(只需在MySQL服务器上发出 SHOW GLOBAL status 查询)。记住,如果key_reads 返回一个大值,那么key_buffer_size的值可能太小。
MyISAM和MySQL 8.0
如果你问一些 MySQL工程师们,他们会说MyISAM不应该再使用了。为什么?有人说,因为当MySQL向前发展时,他们将以前只能在 MyISAM 中看到的大部分功能添加到 InnoDB中,从而实际上使MyISAM过时:
- 自5.6版起,InnoDB中就提供了全文索引。
- 从5.6版开始,InnoDB中就提供了可移植的表空间。
- 空间索引自5.7版起在InnoDB中可用。
- InnoDB自5.7版起提供了表的最终更新
那么,你还应该使用MyISAM吗?可能不会。但有一点需要注意,简单的 COUNT(*)查询在MyISAM上的执行速度可能会比在InnoDB上更快,MyISAM将表记录数存储在元数据中,而InnoDB不会。
我正在使用MyISAM,想切换到InnoDB,我该怎么做?
如果您仍然使用MyISAM并希望切换到InnoDB,只需将所有表转换为InnoDB即可。显然,说起来容易做起来难,但这里有一个简单的指南:
1.找出MySQL实例中的哪些表正在使用MyISAM:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
2.将所有MyISAM表转换为InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
如果不想一个接一个地运行多个ALTER TABLE语句,请考虑将ALTER STABLE语句放入循环中。就这样,转换完成!
小结
MyISAM是最受欢迎的 MySQL 存储引擎之一。该引擎是MySQL 5.5以下版本的默认引擎。该引擎是继InnoDB之后最流行的选择之一,但从MySQL 8.0开始,它就可以被称为过时了 – MySQL已经确保在使用InnoDB时,MyISAM可以完成的所有工作都可以完成,因此目前,只有当您希望简单的COUNT(*)查询更快时,MyISAM才非常有用。这样的查询会更快,因为MyISAM将表记录数数字存储在表元数据中–其他 MySQL 引擎则没有。