2

如果这是一个非常愚蠢的问题,请原谅,但我是 MySQL 新手。我有一个相当大的数据库(70 GB),结构简单(只有一个表),我打算用它来快速检索记录。可以想象,grep 一个 70GB 的平面文件并不好玩。

在我的第一次尝试中,我创建了一个表(没什么花哨的,1 个 ENUM,4 个无符号 INT 和 2 个 FLOAT)。由于没有索引的数据检索速度很慢,因此我在表中填充了数据后创建了一个索引,方法是使用类似

create index myid_index on mytable (myid) using btree;

之后,一切正常。检索速度对我来说还可以。然后我注意到我对导入的数据做错了,所以我重新开始。这一次,我在实际填充表之前用索引定义了表。这就是我理解应该做的事情的方式。该命令类似于

create table mytable ( ... , myid INTEGER unsigned, ..., index USING BTREE (myid))

当我这样做时,创建了一个索引,但它似乎不起作用,即检索速度很慢。显然没有使用索引。

两个过程的索引大小相同,并且在“explain mytable”视图中的显示完全相同。唯一的区别是只有在导入所有数据后才定义索引才对我有效。

我究竟做错了什么 ?当我们在这里的时候,第二个问题:当我用'create index'命令定义索引时,我必须给它一个名字。这个名字是干什么用的?我不必在查询期间指定它,是吗?

4

1 回答 1

3

tl; dr:由于以下内容未解决该问题,因此欢迎提供更多答案

实际上,最好先大量导入数据,然后创建索引。通过在导入之前创建索引,您强制 MySQL 在插入每一行后重新计算索引(这实际上并不完全正确,但在概念上很接近)。反之,如果在导入后创建索引,则索引只需构建一次。

由于在数据导入过程中多次更新索引,可能会出现碎片,从而降低性能。我建议OPTIMIZE TABLE [the_table]您在大量插入后发出一个。

至于您的第二个问题,为索引指定名称是可选的。如果省略该子句,MySQL 默认会创建一个。我建议明确指定它,它使检索更容易(例如,您需要在DROP INDEX语句中指定索引名称)。

于 2013-04-23T13:17:10.573 回答