MySQL索引大小

MySQL索引大小,mysql,indexing,Mysql,Indexing,我有两个主键完全相同的表。例如,table1和table2中的school\u name列具有相同的值(这两个表具有相同的行数) 表1: CREATE TABLE `table1` ( `school_name` varchar(512) NOT NULL, `descp` mediumtext, PRIMARY KEY (`school_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

我有两个主键完全相同的表。例如,
table1
table2
中的
school\u name
列具有相同的值(这两个表具有相同的行数)

表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 |
+---------------+-----------------+--------------------+------------+
为什么
表2的主键索引比
表1的主键索引大得多?

看起来这是由于表2中那些额外的列和索引造成的,但我不明白背后的原因

谢谢你的帮助

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

对于InnoDB,主键基本上是完整的表(例如,InnoDB将所有数据存储在索引中)。参见例如…@Solarflare谢谢!myisam呢?如果使用myisam,索引的大小是否应该相同?是的,对于myisam,它们的大小应该相似。但这有关系吗?表数据仍在存储中,需要空间。所以MyISAM有:主键(小),额外的行数据结构(实际上重复主键列,因为这也是数据)。InnoDB有:主键(包括所有数据),没有行数据的附加结构。因此,较小的主键大小本身不会降低您的存储要求(如果您正在寻求的话)。提示:。这是索引大小结果。在收集此统计数据之前,您是否执行过优化表?