mysql - MySQL 索引大小
问题描述
我有两个具有完全相同主键的表。例如,和中的school_name
列具有相同的值(这两个表具有相同的行数)。table1
table2
表格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 中的那些额外的列和索引,但我不明白其背后的原因。
感谢帮助!
解决方案
- 不要使用 MyISAM。切换到 InnoDB。
- InnoDB 磁盘占用量是 MyISAM 的 2 到 3 倍。(这包括数据、索引和“可用”空间。)
- 不要
OPTIMIZE TABLE
在 InnoDB 上使用;这是浪费时间。(很少有例外。)是的,OPTIMIZE
删除了一些碎片空间,但是当您插入/更新/删除时,它很快就会再次被咀嚼。 - MyISAM 的每个索引看起来都很相似——键加上一个指针。
- InnoDB
PRIMARY KEY
是真正的数据,按 PK 排序。因此,它的大小只是 BTree 结构中的额外(非叶)节点。 - InnoDB 的辅助键包括键的列,加上 PK 的列。
- 在大多数情况下,1:1 的表配对是糟糕的架构设计。您的案例可能是一个很好的例外示例——将一个
description
很少使用的大列 ( ) 移出主表 (table2
)。 - 你可能会发现 InnoDB 的“压缩”并不是很有用。它节省了一些磁盘空间,但不一定有助于提高速度。
推荐阅读
- mongodb - mongodb:Docker中无法识别的服务
- reactjs - 使我的功能尽可能通用以检查状态
- wix-react-native-navigation - react-native-navigation showModal 自定义大小
- kubernetes - 使用 ServiceAccount 时,与 ClusterRole 的角色绑定不限于命名空间
- javascript - 如何保护全局变量(窗口)不被覆盖
- sapui5 - sap.m.PlanningCalendar - 如何以 24 小时格式显示小时?
- android - 如何将 Json 整数列表映射到具有相同数量的整数变量的对象?
- javascript - 基于输入选择重定向到按钮点击新的html页面
- javascript - Cordova Inappbrowser 无法显示带有身份验证对话框的网站(用户名和密码)
- node.js - 如何在 Nodejs 中发表评论