2011-12-16 25 views
1

所以我有一个很大的表,我查询(只选择)相当频繁。该表大约有12,000行。自iOS出现以来,运行这些select查询的时间增加了4-5倍。我有一个需要优化的巨大表格。我认为我需要使用索引,但我希望获得更多有关它们的信息

有人告诉我需要为我的表添加索引。我正在使用的查询如下所示:

SELECT * FROM book_content WHERE book_id = ? AND chapter = ? ORDER BY verse ASC 

如何为此表创建索引?这是我刚运行一次的命令吗?索引究竟做什么?我没有在学校学到这些东西,所以他们现在对我来说似乎仍然有点神奇,所以我希望能得到一点教训。

谢谢!

回答

4

你想要一个关于book_id和章节的索引。如果没有索引,服务器会执行table scan,并将整个表加载到内存中以进行搜索。快速搜索您正在使用的RDBMS的CREATE INDEX命令。每创建INSERTDELETEUPDATE时,您都会创建索引,服务器将自动更新索引。索引可以是UNIQUE,它可以在多个字段上(在你的案例中,book_id和chapter)。如果你使它成为UNIQUE,数据库将不允许你插入第二行使用相同的密钥(在本例中为book_id和chapter)。在大多数服务器上,两个字段上有一个索引不同于每个字段上有两个单独索引。

MySQL的例子是:

CREATE INDEX id_chapter_idx ON book_content (book_id,chapter); 

如果你想为每个book_id只有一条记录,章组合,使用这个命令:

CREATE UNIQUE INDEX id_chapter_idx ON book_content (book_id,chapter); 

一个PRIMARY INDEXUNIQUE一个特殊的索引和NOT NULL。每个表只能有一个主索引。实际上,每个表应该有一个主索引来确保表的完整性,特别是在连接期间。

+0

+1了解详情 – 2011-12-16 02:10:00

+1

我的所有表的首选方法是首先创建一个字段“ID”,它是主键,并具有关于身份的规范。这意味着它会自动在每个新记录上创建一个唯一的编号。身份已打开,您无法设置ID。但是,如果主键上的标识关闭,那么标识字段将允许您设置标识,只是您不能复制标识或将其留空。我知道ID字段将有自己的自动索引,如果我有另一个常用的字段,那么我在该字段上创建一个。但不超过3个字段。 – 2011-12-16 02:48:17

1

索引是一个非常敏感的主题。如果你考虑使用它们,你需要非常小心你做了多少。每个表的主键或id应该有一个聚集索引。其余的,这取决于你打算如何使用它们。我对索引主题非常模糊,实际上从来没有和他们合作过,但是从我昨天刚刚观看的研讨会中,你不需要太多索引 - 因为当你不需要索引时,它们实际上可以减慢速度需要使用它们。

假设你在表格上的8个字段中的5个上放置索引。每个索引都被指定用于软件某处的特定查询。那么,当1个查询运行时,它使用那个1索引,并且不需要另外4个。所以这对于这个1查询是不必要的权重。如果你需要一个索引,确保这是一个索引,可以在许多地方使用,而不仅仅是一个地方。

+0

PS我知道这不一定回答你的问题,但知道你是否想要实现索引是非常重要的信息。 – 2011-12-16 01:28:48

+1

一个好的指数也会有很多值(这就是所谓的'选择性');如果我们正在讨论人事数据库表,那么索引这个人的性别没有意义,因为只有两个值。一个好的指数具有低选择性。 – 2011-12-18 13:45:37

2

您不必将索引视为“魔术”。

SQL表上的索引与印刷书籍中的索引非常相似 - 它可让您在不阅读整本书封面封面的情况下找到要查找的内容。

例如,假设您有食谱,并且您正在寻找涉及鸡肉的食谱。本书后面的索引可能会这样说:

chicken: 30,34,72,84 

让你知道你会在这4页上找到鸡肉食谱。在索引中查找这些信息要比阅读整本书要快得多,因为索引较短,(更重要的)是按字母顺序排列,因此您可以在索引中快速找到合适的位置。

因此,一般来说,您希望在您经常需要查询的列(book_id和chapter,在您的示例中)上创建索引。

2

当您声明一个列作为主键时,会自动在该列上生成一个索引。在你的情况下,更经常地选择索引是理想的,因为它们可以缩短选择查询的时间并降低插入的时间。因此,您可以创建您认为需要的索引而不必担心性能

相关问题