标签: composite-index

我什么时候应该使用复合索引?

  1. 我应该何时在数据库中使用复合索引?
  2. 使用复合索引的性能分支是什么?
  3. 我为什么要使用复合索引?

例如,我有一张homes桌子:

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  PRIMARY KEY  (`home_id`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
) ENGINE=InnoDB  ;
Run Code Online (Sandbox Code Playgroud)

是否有意义,我使用的复合指数都geolatgeolng,这样的:

我替换:

  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
Run Code Online (Sandbox Code Playgroud)

有:

KEY `geolat_geolng` (`geolat`, `geolng`)
Run Code Online (Sandbox Code Playgroud)

如果是这样:

  • 为什么?
  • 使用复合索引的性能分支是什么?

更新:

由于很多人都声明它完全依赖于我执行的查询,因此下面是最常见的查询:

SELECT * FROM homes
WHERE geolat BETWEEN ??? AND …
Run Code Online (Sandbox Code Playgroud)

mysql indexing composite-index

122
推荐指数
6
解决办法
6万
查看次数

Mysql覆盖vs复合vs列索引

在以下查询中

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
  AND   col4='value2'
Run Code Online (Sandbox Code Playgroud)

如果我在col3上有一个单独的索引,而在col4上有另一个索引,那么在这个查询中将使用哪一个?

我在某处读到,对于查询中的每个表,只使用一个索引.这是否意味着查询无法使用这两个索引?

其次,如果我同时使用col3col4创建了一个复合索引,但在WHERE子句中只使用了col3,那么性能会更差吗?例:

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
Run Code Online (Sandbox Code Playgroud)

最后,在所有情况下使用覆盖索引是否更好?MYISAM和innodb存储引擎有什么不同?

mysql sql indexing composite-index covering-index

36
推荐指数
2
解决办法
1万
查看次数

是否有订购MYSQL复合索引的最佳方法?

我正在寻找向MYSQL数据库中的表添加复合索引,该数据库的大小可能是几百万行.复合材料将包含两个varchar列以及三个int列.我的问题如标题所述:是否存在创建此综合指数的最佳顺序?例如,其中一个int行可能只有6个可能的值,那么该列是否更接近索引定义的前端?同样,其中一个varchar列可能有数百万个不同的值,如果它们靠近索引定义的前面或后面?

mysql indexing composite-index

15
推荐指数
1
解决办法
4751
查看次数

2个索引之间的差异,列以相反顺序定义

以下两个索引之间是否有任何差异?

  • IDX_IndexTables_1
  • IDX_IndexTables_2

如果有,有什么区别?

create table IndexTables (
    id int identity(1, 1) primary key,
    val1 nvarchar(100),
    val2 nvarchar(100),
)

create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO

create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server indexing composite-index

11
推荐指数
1
解决办法
1395
查看次数

SQL Server中的复合聚簇索引

我有一个表IDENTITY列作为主键(经典ID列).

SQL Server自动为该主键创建聚簇索引.

我的问题是:

  • 我可以只有一个具有更多列的CLUSTERED INDEX复合材料吗?

如果是,我如何删除默认聚簇索引并重新创建具有此属性的新索引.

感谢您的支持

sql-server database-design composite-index

10
推荐指数
1
解决办法
9352
查看次数

用于范围查询条件的Oracle组合索引

我有一张表Blah(纬度浮点数,经度浮点数,create_time日期,owner_id int,.....)

我的代码只做一个查询

select * 
from Blah 
where latitude < l1 and latitude > l2   
and longitude < ll1 and longitude > ll2   
and create_time < t1 and create_time > t2 
and owner_id < o1 and owner_id > o2 ;
Run Code Online (Sandbox Code Playgroud)

(当然值l1,l2,...... o1,o2是来自程序的动态参数)

我的问题是我应该创建什么样的索引; 综合指数?在复合索引的情况下,我应该先放哪一列?指数的效果如何?

我想了很久,并且找不到有关oracle索引如何工作的详细文档.

我可以找到使用B-tree实现的文档,在我们的例子中:B-tree中的每个键都是一个4元组:( column1,column2,column3,column4),其中这些元组的排序关系被定义为词汇订购.

那么对于上面的查询,假设我们的顺序是(owner_id,create_time,纬度,经度),我猜oracle首先需要二进制搜索到点(o1,t1,l1,ll1),对于这个操作,索引确实是有用.但接下来,我们需要找到第一个interium的终点:我们需要找到(o1,t1,l1,ll2),这也可以通过二分搜索来完成.

接下来,我们需要找到满足条件的下一部分,所以我们需要找到(o1,t1,lx,ll1)其中lx是大于l1的下一个值,我们也可以通过二分搜索找到它.但在我们的情况下,很可能对于相同的纬度,经度不会超过1,因此这里的二分搜索并不比线性扫描更有效.

遵循这种精神,似乎我们应该首先使用小值范围基数列,在本例中为create_time,如果我们的点仅在几天内创建.如果我们从不做范围条件,但只有等于(=)条件,那么哪个列是第一列并不重要,对吧?

为了更清楚,这是一个更简单的例子:

假设我有2列,X和Y.

在db中,两者的值都是[1,2,.... 100],所以我们有100x100行

我的疑问是

select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15;
Run Code Online (Sandbox Code Playgroud)

说我们的索引是(X,Y),所以两个值之间的比较规则是

v1 < v2 <=====> …
Run Code Online (Sandbox Code Playgroud)

oracle indexing optimization composite-index

9
推荐指数
1
解决办法
2966
查看次数

综合指数的开销

我有很多表,我有外键索引,以及包含这些外键的聚簇索引.例如,我有一个如下表:

TABLE: Item
------------------------
id       PRIMARY KEY
owner    FOREIGN KEY
status

... many more columns
Run Code Online (Sandbox Code Playgroud)

MySQL为主键和外键生成索引,但有时,我想提高查询性能,因此我将创建聚簇索引或覆盖索引.这导致索引具有重叠列.

INDEXES ON: Item
------------------------
idx_owner (owner)
idx_owner_status (owner, status)
Run Code Online (Sandbox Code Playgroud)

如果我删除了idx_owner,通常使用的未来查询idx_owner将只使用,idx_owner_status因为它具有owner索引中的第一列.

值得留意idx_owner吗?idx_owner_status即使MySQL只使用部分索引,是否还有额外的I/O开销?

编辑:我真的只对InnoDB关于索引的行为感兴趣.

mysql innodb composite-index

8
推荐指数
1
解决办法
431
查看次数

Postgresql 中是否需要对复合主键的一部分建立索引?

我有一个带有复合主键的(大)表,由 5 列(a、b、c、d、e)组成。

我想有效地选择具有给定值的其中两列(a + e)的所有行。

在 PostgreSQL 中,我需要一个索引吗?或者数据库会使用主键(甚至部分使用?)

我看过下面的帖子,其中指定 MySQL 可以使用多列索引的最左边部分来有效地查询行。但我在复合主键上没有找到 PostgreSQL 的任何内容。

postgresql indexing primary-key composite-index composite-primary-key

6
推荐指数
1
解决办法
2659
查看次数

mysql复合索引是否会使其他索引完全冗余?

如果我在(a,b)上有一个复合索引,我理解只关注'a'的查询仍将使用复合索引(但不是与'b'有关的查询)

我的问题是,如果我有(a,b)索引,是否有任何正当理由在'a'上设置单列索引?我所读过的关于(a,b)索引是否完全替代a或者仅仅是"总比没有"的索引似乎含糊不清.

这假设我通过a和a,b进行过滤.我有一个表太多索引的表,这会损害写入性能,并希望在删除索引之前仔细检查,我只是相当肯定没有做任何好事.

此外,这个答案会根据我使用InnoDb还是MyISAM而改变?有关的表格是MyISAM,但我们的大部分表格都是InnoDb.

mysql indexing composite-index

5
推荐指数
1
解决办法
279
查看次数

复合索引中的单独连接子句

复合指数是否有利于这样的事情:

SELECT * FROM a INNER JOIN b ON(a.id=b.id)
                INNER JOIN c ON(a.bar=c.id)
                INNER JOIN d ON(a.foo=d.id)
Run Code Online (Sandbox Code Playgroud)

指数将是:

(a.id, a.bar, a.foo)
Run Code Online (Sandbox Code Playgroud)

mysql composite-index

5
推荐指数
1
解决办法
730
查看次数