标签: database-indexes

mysql - 好的实践:有多个索引的表?

对不起,

我确实有这个有3列的迷你表,但是,我将列出一个或另一列的值.

1)有两个索引列可以吗?

2)我们每张桌子应该只有一个索引吗?

3)在极限情况下,如果我们有一个包含100列的表,并且我们有50个带索引,这可以吗?

谢谢,MEM

mysql database-indexes

3
推荐指数
1
解决办法
2374
查看次数

在Postgres字符串数组上创建不区分大小写的索引

varchar[]在Postgres 9.2中使用了一个列(varchar数组)来存储一些标签.在按标记检索行时,我希望查询不区分大小写.但是,我想保留在UI中显示的大小写(因此我不能只将小部件存储为小写).

所以,我的问题是如何在varchar数组中在Postgres中创建一个不区分大小写的索引?一种可能的方法是在列上创建功能性GIN索引.怎么做到这一点?还有其他方法吗?

postgresql database-indexes postgresql-9.2

3
推荐指数
1
解决办法
2865
查看次数

复合键VS主键+不唯一索引

这是我有的:

table content : cat_id product_id data1 data2 etc.
这些类别显然不是唯一的.产品ID是独一无二的.

2 queries : 1 -- SELECT * WHERE cat_id = :cat - must be as quick as possible 2 -- SELECT * WHERE product_id = :prodId In second select, I can add : AND cat_id = :cat

效率更高的是什么?

  • 1 - cat_id上的索引(不唯一)(适用于选择1)
  • 2 - product_id上的主键(唯一 - >选择2的优秀)
  • 3 - product_id上cat_id + PK上的索引(非唯一)(分别适用于1和2)
  • 4 - 使用复合[cat_id + product_id]的唯一约束(适用于1和2)
  • 5 - 与4相同,但将复合定义为PK
  • 6 - 复合(4或5)+单指数/ PK

有关信息,我将在每个类别中有大约20种产品和许多类别(比如3000) - 并且(因为它在表中是独一无二的)一个产品只属于一个类别 …

mysql database innodb database-indexes

3
推荐指数
1
解决办法
1274
查看次数

按不使用索引分组

有一个表有交易,它的行数是 2.2 亿,其中一列是counterparty. 该列已编入索引。如果我运行一个普通的查询,如:

select * 
  from <table> 
 where counterparty = 'X'
Run Code Online (Sandbox Code Playgroud)

该计划显示它使用索引。好像我在同一列上使用 group by 一样,它不使用索引并进行表扫描。即:对于以下查询:

select counterparty, count(*)
  from <table>
 group by counterparty
Run Code Online (Sandbox Code Playgroud)

能否请您指教,为什么它不使用索引group by?仅供参考 - 我已经运行了 db stats。

仅供参考 - 第一次和第二次查询的计划如下所示:

注意 - 当我group by在具有相同索引的 Sybase 中使用相同的数据时,我们正在将数据从 Sybase 迁移到 oracle 。查询使用索引,但不在 oracle 中。

第一的

Plan hash value: 350128866

| Id  | Operation                   | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT            |                     |  2209 | …
Run Code Online (Sandbox Code Playgroud)

sql oracle database-indexes

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

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

UNIQUE SQL 索引是否也用于加快搜索速度?

假设有一个“系列值”的 SQL 数据库。每个都Value属于 a Series,并且有一个日期:

@Entity
class Series { … }

Value {
   Series series;
   Date date;
   …
   }
Run Code Online (Sandbox Code Playgroud)

对于系列和日期的每个组合,每个值都是唯一的,由该索引保证:

UkSeries UNIQUE INDEX value (series ASC, data ASC)
Run Code Online (Sandbox Code Playgroud)

在Hibernate中,上面的索引就是通过这个注解创建的:

@Table (
    uniqueConstraints = @UniqueConstraint (columnNames = {"series", "data"}))
Run Code Online (Sandbox Code Playgroud)

现在,请将它与这个可能的替代索引定义进行比较:

UkSeries UNIQUE INDEX value (series ASC, data ASC)
IdxSeries INDEX value (series ASC, data ASC)

@Table (
    uniqueConstraints = @UniqueConstraint (columnNames = {"series", "data"}),
    indexes = { @Index (name = "IdxSeries", columnList = "series, data") })
Run Code Online (Sandbox Code Playgroud)

考虑到我还想加快在数据库中搜索值的速度,我的问题是 …

mysql sql database-performance database-indexes

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

在只有两种类型的值的列上创建索引的效果如何

我在一个列上创建了一个索引,它只有两个可能的值(Y 和 N),两个值的数据类型相同。

假设列名是指标。我写了一个选择语句,例如,

SELECT INDICATOR 
FROM TEMP_TABLE 
ORDER BY INDICATOR
Run Code Online (Sandbox Code Playgroud)

当我在 SQL developer 中为这个查询使用解释计划时,它使用的是全表扫描而不是索引扫描。

为什么不使用索引表扫描。

oracle query-performance database-indexes

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

MySQL:创建没有索引的外键

在MySQL 5.6.34中是否可以有没有索引的外键?我想要那是因为我在2000万行中用另一个表的外键创建了一个可为空的列。由于这是一项新功能,因此只有新行的该列可能会填充实际值,并且您可能会期望该索引的基数变得可怕。因此,在大多数情况下,使用该索引实际上不是一个好主意。问题:我有很多查询都具有相同的限制:

[...] from large_table where tenant_id = ? and nullable_foreign_key_with_index is null and [...]
Run Code Online (Sandbox Code Playgroud)

问题?MySQL认为使用index_merge / intersect策略进行查询解析是一个好主意。在这种情况下的MySQL会做2个查询并行:一个tenant_id(使用一个有效和良好的指数)和另一个nullable_foreign_key_with_index是坏的,几乎是给定的“全表并行扫描”,这个指数的基数是<1000中有超过2000万行的表格。有关此“问题”的更多详细信息,请参见此处

那么,什么是可行的解决方案?鉴于MySQL“强制”外键附加了索引:

  1. 删除外键和索引。这很糟糕,因为在应用程序出现错误的情况下,我们可能会损害参照完整性。

  2. FOREIGN_KEY_CHECKS = 0; 跌落指数;FOREIGN_KEY_CHECKS = 1。这很不好,因为即使外键仍然存在,MySQL也不再验证该列以检查该值是否实际存在。那是个错误吗?

  3. 在所有现有查询中使用查询提示,以确保我们仅使用旧的高效“ tenant_id_index”。这很糟糕,因为我必须查找所有现有查询,并且还记得在构建新闻查询时再次使用它。

因此,我怎么说:“ MySQL,不必为这个外键创建索引,而是继续验证相关​​表中的内容,该表无论如何都由主键索引”。我想念什么吗?到目前为止,最好的主意是删除外键,仅相信该应用程序可以按预期运行(可能确实如此),但这将引发关于在APP与DATABASE中具有约束的经典讨论。有任何想法吗?

mysql sql indexing foreign-keys database-indexes

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

哈希文件组织和哈希索引组织有什么区别?

来自数据库系统概念

\n\n
\n

散列可以用于两个不同的目的。

\n\n
    \n
  • 在哈希文件组织中,我们通过计算记录的搜索键值的函数直接获得包含所需记录的磁盘块的地址。

  • \n
  • 在哈希索引组织中,我们将搜索键及其关联的指针组织到哈希文件结构中。

  • \n
\n
\n\n

“哈希文件结构”是什么意思?

\n\n

我对此不太确定,所以我不确定散列 \xef\xac\x81le 组织和散列索引组织之间有什么区别。\n您能分别显示或改写它们是什么吗?

\n

database hash rdbms database-indexes data-structures

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

如何优化 PostgreSQL 的多列搜索

我在 PostgreSQL 中有一个表,它有 20 列,其中大部分是枚举类型。这个表有数百万行。

我想支持并加速搜索具有多个字段的行的查询,例如:col2=value1&col3=value2&col5=value3 page=1

我无法使用 PostgreSQL 的复合索引,因为它只适用于固定的列顺序。例如,如果我在 上建立索引(col2,col3,col5),那么它不能用于搜索col1=value1&col2=value2

我还想支持以下查询:

col1=value1&col2=(value3 or value4) orderby=col3 page=1

解决这个问题的方法是什么?如果我不需要对这些列中的任何列进行全文搜索(因为它们都是枚举类型),那么解决方案可以是轻量级的吗?

postgresql database-indexes

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