首页 > 解决方案 > MySQL 索引大小

问题描述

我有两个具有完全相同主键的表。例如,和中的school_name列具有相同的值(这两个表具有相同的行数)。table1table2

表格1:

CREATE TABLE `table1` (
    `school_name` varchar(512) NOT NULL,
    `descp` mediumtext,
    PRIMARY KEY (`school_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

表 2:

CREATE TABLE `table2` (
    `school_name` varchar(512) NOT NULL,
    `address` mediumtext,
    --5 more fields here...
    PRIMARY KEY (`school_name`),
    --4 more other index...
    --E.G., KEY field_3_index (field_3)...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

这是索引大小的结果:

+---------------+-----------------+--------------------+------------+
| database_name | table_name      | index_name         | size_in_mb |
+---------------+-----------------+--------------------+------------+
| schoolsDB     | table1          | PRIMARY            |   10355.97 |
| schoolsDB     | table2          | PRIMARY            |     794.69 |
+---------------+-----------------+--------------------+------------+

为什么table2's PRIMARY KEY 索引比table1's 大很多?

看起来这是由于 table2 中的那些额外的列和索引,但我不明白其背后的原因。

感谢帮助!

标签: mysqlindexing

解决方案


  • 不要使用 MyISAM。切换到 InnoDB。
  • InnoDB 磁盘占用量是 MyISAM 的 2 到 3 倍。(这包括数据、索引和“可用”空间。)
  • 不要OPTIMIZE TABLE在 InnoDB 上使用;这是浪费时间。(很少有例外。)是的,OPTIMIZE删除了一些碎片空间,但是当您插入/更新/删除时,它很快就会再次被咀嚼。
  • MyISAM 的每个索引看起来都很相似——键加上一个指针。
  • InnoDBPRIMARY KEY是真正的数据,按 PK 排序。因此,它的大小只是 BTree 结构中的额外(非叶)节点。
  • InnoDB 的辅助键包括键的列,加上 PK 的列。
  • 大多数情况下,1:1 的表配对是糟糕的架构设计。您的案例可能是一个很好的例外示例——将一个description很少使用的大列 ( ) 移出主表 ( table2)。
  • 你可能会发现 InnoDB 的“压缩”并不是很有用。它节省了一些磁盘空间,但不一定有助于提高速度。

推荐阅读