我在MyISAM存储引擎上的MySQL中有以下架构的大量行(数十亿)。有关如何更有效地存储(存储方式)的任何建议吗?
mysql> describe options;
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| stockid | int(10) unsigned | NO | MUL | NULL | |
| strike | float | NO | | NULL | |
| symbol | varchar(63) | NO | | NULL | |
| last | float | NO | | NULL | |
| chg | float | NO | | NULL | |
| bid | float | NO | | NULL | |
| ask | float | NO | | NULL | |
| expirydate | varchar(63) | YES | | NULL | |
| ticker | varchar(63) | YES | | NULL | |
| expiry | datetime | YES | | NULL | |
| type | varchar(63) | YES | | NULL | |
| datecaptured | datetime | YES | | NULL | |
| volume | bigint(20) | YES | | NULL | |
| openint | bigint(20) | YES | | NULL | |
| lastclosedate | date | YES | | NULL | |
| row_id | int(11) | NO | PRI | NULL | auto_increment |
+---------------+------------------+------+-----+---------+----------------+
答案 0 :(得分:1)
这里最明显的问题是将日期存储为字符串,使用的空间比必要的多,并且使索引不切实际。您还需要检查为什么第一列设置为不规则INT(10) UNSIGNED
类型而不是默认INT(11)
。
如果您想要非常紧凑的表格,可能需要尝试使用ARCHIVE
engine类型。它只有附加表,但它们是压缩的,可以容纳大量数据而无需修剪或修剪。缺点是他们没有索引,但这对你来说似乎不是一个问题。
注意:MyISAM是一个非常古老而脆弱的存储引擎,所以如果你可以从它迁移到InnoDB,你会更好。由于MyISAM没有日志,因此无法轻松地从服务器崩溃中恢复,并且很容易被损坏而无法修复。 InnoDB能够从大多数情况下恢复,在不能的情况下,您仍然可以只读取它并在其他地方使用数据。
如果SHOW TABLE STATUS
没有表明存储问题,请不要担心。硬盘驱动器很便宜,甚至是SSD品种。