Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 来自组合键的索引是否足够?_Sql_Performance_Sqlite_Indexing_Composite Key - Fatal编程技术网

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和索引中的列数之间),则可能会使用它。在您的情况下,如果您的查询使用
    名称
    名称
    页面
    ,则可能会使用它-如果您的查询仅在
    页面
    上,则该复合索引肯定是无用的