四时宝库

程序员的知识宝库

MYSQL存储引擎InnoDB(十七):将表从 MyISAM 转换为 InnoDB(下)

存储要求

如果您打算在转换过程中在InnoDB表中制作多个临时数据副本,建议您在独立表空间中创建表,以便在删除表时可以回收磁盘空间。当 innodb_file_per_table 启用配置选项(默认)时,新创建 InnoDB的表将隐式创建在独立表空间中。

无论是MyISAM直接转换表还是创建克隆InnoDB表,在此过程中请确保您有足够的磁盘空间来容纳新旧表。 InnoDB表比MyISAM表需要更多的磁盘空间。 如果ALTER TABLE操作空间不足,它会开始回滚,如果它是磁盘绑定的,则可能需要数小时。对于插入,InnoDB使用插入缓冲区将二级索引记录批量合并到索引中。这节省了大量的磁盘 I/O。对于回滚,没有使用这种机制,回滚可能需要比插入长 30 倍的时间。

在失控回滚的情况下,如果您的数据库中没有有价值的数据,建议终止数据库进程而不是等待数百万磁盘 I/O 操作完成。


定义主键

PRIMARY KEY子句是影响 MySQL 查询性能以及表和索引空间使用的关键因素 。主键唯一标识表中的一行。表中的每一行都应该有一个主键值,并且没有两行可以有相同的主键值。

1、为每个表声明一个PRIMARY KEY。通常,它是您在查找单行时在WHERE子句中引用的最重要的列。

2、在原始CREATE TABLE语句中声明PRIMARY KEY子句 ,而不是稍后通过 ALTER TABLE语句添加。

3、仔细选择列及其数据类型。首选数字列而不是字符或字符串列。

4、如果没有另一个稳定的、唯一的、非空的数字列可供使用,请考虑使用自动增量列。

5、如果不确定主键列的值是否会改变,自动增量列也是一个不错的选择。更改主键列的值是一项昂贵的操作,可能涉及重新排列表内和每个二级索引内的数据。

考虑向任何还没有主键的表添加主键。根据表格的最大投影大小使用最小的实用数值类型。这可以使每一行稍微更紧凑,也可以为大型表节省大量空间。如果表有任何二级索引,则空间节省会成倍增加,因为主键值在每个二级索引条目中重复。除了减少磁盘上的数据大小之外,一个小的主键还可以让更多的数据进入缓冲池,从而加快各种操作并提高并发性。

如果表在某个较长的列上已有主键,请考虑添加一个新的无符号 AUTO_INCREMENT列并将主键切换到该列,即使查询中未引用该列也是如此。这种设计更改可以在二级索引中节省大量空间。您可以指定以前的主键列UNIQUE NOT NULL来强制执行与PRIMARY KEY子句相同的约束。防止所有这些列中出现重复值或空值。

如果您将相关信息分布在多个表中,通常每个表都使用相同的列作为其主键。例如,一个人事数据库可能有几个表,每个表都有一个员工编号的主键。一个销售数据库可能有一些表的主键是客户编号,而其他表的主键是订单号。由于使用主键的查找速度非常快,因此您可以为此类表构建高效的连接查询。

如果您完全忽略PRIMARY KEY子句,MySQL 会为您创建一个不可见的子句。它是一个 6 字节的值,可能比您需要的要长,因此会浪费空间。因为它是隐藏的,所以您不能在查询中引用它。


应用程序性能注意事项

InnoDB的可靠性和可扩展性特性使其需要比等效MyISAM表消耗更多的磁盘存储空间。您可以稍微更改列和索引定义,以获得更好的空间利用率,减少处理结果集时的 I/O 和内存消耗,以及更好的查询优化计划以有效利用索引查找。

如果您为主键设置数字 ID 列,请使用该值与任何其他表中的相关值交叉引用,尤其是对于连接查询。例如,与其接受国家名称作为输入并执行查询以搜索相同的名称,不如执行一次查找以确定国家 ID,然后执行其他查询(或单个连接查询)以跨多个表查找相关信息。与其将客户或目录项目编号存储为可能会占用多个字节的数字字符串,不如将其转换为数字 ID 以进行存储和查询。一个 4 字节的无符号 INT列可以索引超过 40 亿个项目。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接