标签: database-indexes

为什么MySQL会使用索引交集而不是组合索引?

我不时会遇到奇怪的MySQL行为.假设我有索引(type,rel,created),(type),(rel).像这样的查询的最佳选择:

SELECT id FROM tbl
WHERE rel = 3 AND type = 3
ORDER BY created;
Run Code Online (Sandbox Code Playgroud)

将是使用索引(type, rel, created).但MySQL的决定交叉索引(type)(rel),并导致更坏更流畅.这是一个例子:

mysql> EXPLAIN
    -> SELECT id FROM tbl
    -> WHERE rel = 3 AND type = 3
    -> ORDER BY created\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tbl
         type: index_merge
possible_keys: idx_type,idx_rel,idx_rel_type_created
          key: idx_type,idx_rel
      key_len: 1,2
          ref: NULL
         rows: 4343
        Extra: Using intersect(idx_type,idx_rel); Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)

和相同的查询,但添加了一个提示:

mysql> EXPLAIN
    -> SELECT id …
Run Code Online (Sandbox Code Playgroud)

mysql query-optimization sql-execution-plan database-indexes

7
推荐指数
1
解决办法
7662
查看次数

MySQL优化:EXPLAIN"Extra"列包含"Using Where"

所以我一直认为在Extra栏中看到"Using Where"是一件好事.然而,我正计划为我的同事准备一个棕色的包午餐来解释EXPLAIN,现在我不太确定.MySQL文档在关于"使用位置"的说明中说明了这一点:

WHERE子句用于限制哪些行与下一个表匹配或发送到客户端.除非您特意打算从表中获取或检查所有行,否则如果Extra值不是Using where并且表连接类型为ALL或index,则查询可能会出错.即使您正在为WHERE子句的所有部分使用索引,您也可以看到如果列可以为NULL则使用where.

这使我相信即使我的WHERE子句只包含索引的一部分,如果列可以具有NULL值,MySQL仍将检查行.

真的吗?如果是这样,如果我不需要它,我应该将列更改为不包括NULL吗?我会看到提速吗?

mysql database-optimization database-indexes

7
推荐指数
1
解决办法
8320
查看次数

mysql - 如何在没有索引的情况下运行查询

我希望比较索引并进一步优化我的代码。我想要做的是强制查询在没有索引的情况下运行,以便我可以看到它产生了什么不同。是否有可能做到这一点?

mysql indexing query-optimization database-indexes

7
推荐指数
1
解决办法
2531
查看次数

如果索引依赖于该列而不重新创建索引,如何将列从null更改为非null?

我有一个Column声明为的列,NULL DEFAULT(GETUTCDATE())并且有一个包含此列的非聚集索引.我想将此列更改为NOT NULL DEFAULT(GETUTCDATE()),当我运行ALTER TABLE ALTER COLUMN语句时,SQL Azure服务表示它无法更改列,因为根据此列有一个索引.

这是一个生产数据库,该表包含大约一千万条记录.所以我宁愿不删除并重新创建索引,因为这会降低数据库的速度(特别是创建索引可能需要几分钟).

如何在不重新创建索引的情况下更改列?

database sql-server alter-column database-indexes azure-sql-database

7
推荐指数
1
解决办法
2441
查看次数

在已存在主键或唯一键约束的列上创建索引

我目前正在学习Oracle中的索引.在Oracle 文档中,可以找到以下内容:

尽管数据库在具有完整性约束的列上为您创建索引,但建议在此类列上显式创建索引.

这里有人可以告诉我这背后的理由吗?如果数据库自动创建索引,为什么我们要明确地在这些列上创建另一个索引?

sql oracle database-indexes

7
推荐指数
1
解决办法
70
查看次数

是否可以执行通常的原子 INSERT 操作但异步更新索引?

索引使读取速度更快,但写入速度更慢。但是为什么不能进行单次写入并让数据库随时间异步添加索引,并在 INSERT 中缓存直到建立索引?

有这样的数据库吗?

sql postgresql database-indexes

7
推荐指数
1
解决办法
1013
查看次数

如何删除 Cloud Firestore 中的复合索引?

文档说:https : //firebase.google.com/docs/firestore/query-data/indexing

要删除索引:

Go to the Cloud Firestore section of the Firebase console.
Click the Indexes tab.
Hover over the index you want to delete and select Delete from the context menu.
Confirm that you want to delete it by clicking Delete from the alert.
Run Code Online (Sandbox Code Playgroud)

在当前的 Cloud Firestore 上,

  • 可以使用右侧子菜单删除单个字段索引
  • 但是悬停不起作用,复合索引部分不存在子菜单

我只找到了一个控制台命令来删除所有为 firestore 数据库编制的索引

database-indexes flutter firebase-console google-cloud-firestore

7
推荐指数
2
解决办法
1746
查看次数

Cassandra 1.1存储引擎如何存储复合材料?

我想要了解Cassandra的复合色谱柱存储引擎.不幸的是,到目前为止我读过的文档包含错误,让我有点空白.

首先,术语.

复合列通过使用复合主键包含完全非规范化的宽行.

这似乎具有误导性,因为AFAIK复合列可以用于复合键,也可以简单地用作除键之外的复合列.

1:如何实现复合键和列名?我能找到的每个CQL示例只显示复合键作为列,而不是普通复合列.

假设我们将列'a','b','c','d'作为主要复合键+列'e','f'.我知道'a'将是行和分区键.

我们假设以下数据:

a    b    c    d    e    f
1a   1b   1c   1d   e1   f1
1a   1b   1c   2d   e1   f2
1a   1b   1c   2d   e2   f3
2a   2b   2c   2d   e2   f4
Run Code Online (Sandbox Code Playgroud)

2:这是如何存放在引擎盖下的?我想这里真正的问题是'b','c','d'如何映射出来,因为列根据定义不是分层的.

3:我读过的文档说不再使用紧凑型存储.但是如果不需要添加非主键列呢...那么不使用它的原因是什么?

indexing storage composite-key cassandra database-indexes

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

POSIX 的 read() 和 write() 系统调用是原子的吗?

我正在尝试根据Lehman 和 Yao 在本文中建议的数据结构(B链接树)和算法来实现数据库索引。在第 2 页,作者指出:

磁盘分区为固定大小的部分(物理页;在本文中,这些对应于树的节点)。这些是进程可以读取或写入的唯一单元。[强调我的](...)

(...) 允许进程锁定和解锁磁盘页面。这个锁赋予该进程对该页面的独占修改权;此外,进程必须锁定页面才能修改该页面。(...)不会阻止其他进程读取锁定的页面。[强调我的]

我不完全确定我的解释是正确的(我不习惯阅读学术论文),但我认为可以从强调的句子中得出结论,作者的意思是读取和写入页面的操作被假定为“原子” ,从某种意义上说,如果进程 A 已经开始读取(相应地写入)页面,则另一个进程 B 可能不会开始写入(相应地读取)同一页面,直到 A 完成其读取(相应地写入)操作. 多个进程同时读取同一个页面当然是一个合法的条件,因为多个进程同时在不同的页面上执行任意操作(页面 P 上的进程 A,页面 Q 上的进程 B,页面 R 上的进程 C,等等。 )。

  1. 我的解释正确吗?

  2. 我可以假设 POSIX'read()write()系统调用在上述意义上是“原子的”吗?我是否可以依靠这些具有一些内部逻辑的系统调用来根据文件描述符的位置和要读取或写入的块的指定大小来确定是否应该暂时阻止特定read()write()调用?

  3. 如果上述问题的答案是“否”,我应该如何推出自己的锁定机制?

concurrency posix b-tree database-indexes

6
推荐指数
2
解决办法
3564
查看次数

为什么即使使用仅索引扫描,PostgresQL 计数也如此缓慢

我有一个简单的计数查询,可以使用仅索引扫描,但在 PostgresQL 中仍然需要很长时间!

我有一个cars包含 2 列的表,type bigint并且active boolean这些列上还有一个多列索引

CREATE TABLE cars
(
id BIGSERIAL NOT NULL
    CONSTRAINT cars_pkey PRIMARY KEY ,
type BIGINT NOT NULL ,
name VARCHAR(500) NOT NULL ,
active            BOOLEAN DEFAULT TRUE NOT NULL,
created_at        TIMESTAMP(0) WITH TIME ZONE default NOW(),
updated_at        TIMESTAMP(0) WITH TIME ZONE default NOW(),
deleted_at        TIMESTAMP(0) WITH TIME ZONE
);
CREATE INDEX cars_type_active_index ON cars(type, active);
Run Code Online (Sandbox Code Playgroud)

我插入了一些有 950k 条记录的测试数据,type=1 有 600k 条记录

INSERT INTO cars (type, name) …
Run Code Online (Sandbox Code Playgroud)

sql covering-index query-performance database-indexes postgresql-9.5

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