MySQL 数据库我在很多地方都是用过,最早是在安装 wordpress 时接触到的,是一个很棒的开源数据库。但是之前一直只是使用,没有深入研究过。今天,看到一篇关于内存表的文章,突然有了兴趣。仔细研究一下,发现网上的文章写的都不太具体。也许是我自己理解能力不足吧!还是自己记录一下,以便将来查看吧!

1. 创建内存表

创建的脚本如下:

create table test (
    uid int unsigned not null auto_increment primary key,
    date varchar(32)
    `test_id` USING HASH (uid),
) ENGINE=MEMORY;

其实只要添加 ENGINE=MEMORY 就可以了。创建索引的时候可以使用 USING 来指定是 HASH 还是 BTREE。

2. 测试结果

我使用的是 MySQL-5.5 的版本,下面的结果是在这个版本下面测试的结果。

  • 重启之后,内存表中的数据、会全部没有。
  • 重启之后,内存表的结构和索引都会保留。
  • 重启之后,内存表的自增会自动还原到1开始。
  • 内存表可以使用自增、大于、小于等操作,基本没有什么限制。
  • 内存表中的主键默认情况会有索引,但是索引是 Hash,不是 BTree。
  • 内存表中的主键索引类型可以手工改变。

3. 一些问题

网上的一些问题我发现,其实主要是由于 Hash 和 BTree 做索引的区别造成的。 首先,如果使用 Hash,那么查找速度极快,几乎是一个常量。BTree 则受数量影响,虽然不太严重。 其次,使用 Hash 会造成范围查找的低效。例如, where uid < 10 and uid > 0 这种条件。 在 Hash 的时候,我发现基本上要遍历整张表,而 BTree 则不需要,效率远比 Hash 快。