Mat*_*zen 9 mysql innodb myisam optimization
我的数据库速度变慢了。phpMyAdmin 中的分析器建议我OPTIMIZE TABLE在我的表上运行。
但在这样做之前,我(当然)想知道表中的数据是否会发生任何事情,或者此操作是否完全无害。
使用时我应该考虑利弊OPTIMIZE TABLE吗?索引和主键会保持不变吗?数据库中是否有优化后会变慢的区域?
Rol*_*DBA 15
优化表基本上做了三(3)件事
从概念上讲,OPTIMIZE TABLE在mydb.mytable
USE mydb
CREATE TABLE mytabletmp LIKE mytable;
INSERT INTO mytabletmp SELECT * FROM mytable;
ALTER TABLE mytable RENAME mytablezap;
ALTER TABLE mytabletmp RENAME mytable;
DROP TABLE mytablezap;
ANALYZE TABLE mytable;
Run Code Online (Sandbox Code Playgroud)
然而,基于
mydb.mytable/var/lib/mysql让我们看看存储引擎细节
MyISAM 表mydb.mytable物理上存储在三个文件中
/var/lib/mysql/mydb/mytable.frm (表结构)/var/lib/mysql/mydb/mytable.MYD (数据)/var/lib/mysql/mydb/mytable.MYI (索引)运行 OPTIMIZE TABLE 的概念描述会将数据页和索引页复制到一个新的.MYD和.MYI. 这将消除在任一文件中存在碎片页面的情况。
有两个观点需要考虑
随着innodb_file_per_table残疾人,为每个InnoDB表的所有数据页和索引页都存储在系统表空间(一般称为文件ibdata1中)内。
当您OPTIMIZE TABLE在存储在 ibdata1 中的 InnoDB 表上运行时,所有数据和索引页都是连续写入的,因此该表的所有页都在一起。坏消息是它使ibdata1快速增长。
随着innodb_file_per_table启用后,每个InnoDB表的所有数据页和索引页存储之外ibdata1中。这是物理存储mydb.mytable:
/var/lib/mysql/mydb/mytable.frm (表结构)/var/lib/mysql/mydb/mytable.ibd (数据和索引)当您OPTIMIZE TABLE在存储在 ibdata1(系统表空间)之外的 InnoDB 表上运行时,这将执行导致缩小.ibd文件的概念性步骤。
我以前写过这个
Oct 29, 2010: Howto: 清理 mysql InnoDB 存储引擎?(堆栈溢出)Mar 25, 2012:为什么InnoDB 将所有数据库都存储在一个文件中?Apr 11, 2012:如何从 InnoDB 表中删除碎片?Dec 21, 2012: OPTIMIZE TABLE 进度有进度指示器吗?Jan 07, 2013:数据库空间与 ibdata1 大小不匹配但在这样做之前,我(当然)想知道表中的数据是否会发生任何事情,或者此操作是否完全无害。
我刚刚解释了 OPTIMIZE TABLE 如何为两个存储引擎工作。这可能很耗时,具体取决于数据和索引的大小。在地震或停电之外,运行 OPTIMIZE TABLE 不会损害数据并且索引得到重建。
使用 OPTIMIZE TABLE 时我应该考虑利弊吗?
同上
索引和主键会保持不变吗?
是的
数据库中是否有优化后会变慢的区域?
没门。查询没有碎片的表只会更快
| 归档时间: |
|
| 查看次数: |
20625 次 |
| 最近记录: |