Sql 来自组合键的索引是否足够?
这是我的桌子的外观:Sql 来自组合键的索引是否足够?,sql,performance,sqlite,indexing,composite-key,Sql,Performance,Sqlite,Indexing,Composite Key,这是我的桌子的外观: CREATE TABLE pics( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, page INTEGER, w INTEGER, h INTEGER, FOREIGN KEY(page) REFERENCES pages(id) ON DELETE CASCADE, UNIQUE(name, page) ); CREATE INDEX "myidx" ON "pics"("page");
CREATE TABLE pics(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
page INTEGER,
w INTEGER,
h INTEGER,
FOREIGN KEY(page) REFERENCES pages(id) ON DELETE CASCADE,
UNIQUE(name, page)
);
CREATE INDEX "myidx" ON "pics"("page"); # is this needed?
所以
UNIQUE(名称、页面)
应该创建一个索引。但是这个索引是否足以进行只涉及页面
字段的快速查询?比如选择一组“图片”,其中page=?
。或者在pics.page
上加入pages.id?或者我应该为页面字段创建另一个索引(myidx)?如上所述,您将需要另一个myidx
索引,因为您的唯一
索引首先指定名称。也就是说,可以通过以下方式进行查询:
name
名称
和页面
但不能仅通过页面
您的另一个选项是对唯一
索引重新排序,并将页面
列放在第一位。然后它可以用于页面
仅查询,但将与名称
仅查询不兼容。您必须分析将使用此表的查询,并确定查询将使用哪些字段对结果进行排序。您应该为用于排序最多的字段编制索引。将复合索引视为电话簿。电话簿按姓氏排序,然后按名字排序。如果你的名字叫Bob Smith,你可以很快找到S部分,然后是Sm,然后是所有的Smith,最后是Bob。这很快,因为索引中有两个键。因为这本书是按姓氏排列的,所以找到所有史密斯的条目也同样简单
现在想象一下,试图在整个电话簿中找到所有叫鲍勃的人。难多了,对吧
这类似于磁盘上索引的组织方式。当列表按(名称,页面)
顺序排序时,查找具有特定页面列的所有行基本上会导致对所有行进行顺序扫描,逐个查找具有该页面的任何内容
有关索引如何工作的更多信息,我建议通读。对于排序,我可以使用没有索引的w
和h
:/如果你说的是正确的,我必须为表中的所有字段添加索引。.Mike Christensen正在说我想说的话。在任何复合索引中,如果您的查询使用n个最左边的列(其中n在1和索引中的列数之间),则可能会使用它。在您的情况下,如果您的查询使用名称
或名称
和页面
,则可能会使用它-如果您的查询仅在页面
上,则该复合索引肯定是无用的