我知道二进制搜索是如何工作的,但我想知道二进制搜索的实际用途......我通过互联网搜索,我发现主要用途是数据库索引,但我无法理解二进制搜索如何帮助数据库索引.
database algorithm binary-search relational-database database-indexes
delayed_job定期执行这样的查询:
SELECT "delayed_jobs".*
FROM "delayed_jobs"
WHERE ((run_at <= '2012-05-23 15:16:43.180810' AND (locked_at IS NULL OR locked_at < '2012-05-23 11:16:43.180841') OR locked_by = 'host:foo pid:1') AND failed_at IS NULL)
ORDER BY priority ASC, run_at ASC LIMIT 5
Run Code Online (Sandbox Code Playgroud)
我在相当大的数据库机器上的日志报告显示需要四分之一秒才能运行.我可以在所选的所有列上抛出一些索引,但我可以从多列索引中获得更多性能.
我可以为此查询创建的最佳多列索引是什么?有没有可以为我计算的工具?
更新
postgres版本:9.1.3
一个现有索引:priority,run_at(名为"delayed_jobs_priority")
出于explain analyze:
Limit (cost=0.00..219.65 rows=5 width=1154) (actual time=0.727..0.727 rows=0 loops=1)
-> Index Scan using delayed_jobs_priority on delayed_jobs (cost=0.00..351.43 rows=8 width=1154) (actual time=0.725..0.725 rows=0 loops=1)
Filter: ((failed_at IS NULL) AND (((run_at <= '2012-05-23 18:11:03.980113'::timestamp without time zone) AND …Run Code Online (Sandbox Code Playgroud) sql postgresql multiple-columns delayed-job database-indexes
我正在尝试根据Lehman 和 Yao 在本文中建议的数据结构(B链接树)和算法来实现数据库索引。在第 2 页,作者指出:
磁盘分区为固定大小的部分(物理页;在本文中,这些对应于树的节点)。这些是进程可以读取或写入的唯一单元。[强调我的](...)
(...) 允许进程锁定和解锁磁盘页面。这个锁赋予该进程对该页面的独占修改权;此外,进程必须锁定页面才能修改该页面。(...)锁 不会阻止其他进程读取锁定的页面。[强调我的]
我不完全确定我的解释是正确的(我不习惯阅读学术论文),但我认为可以从强调的句子中得出结论,作者的意思是读取和写入页面的操作被假定为“原子” ,从某种意义上说,如果进程 A 已经开始读取(相应地写入)页面,则另一个进程 B 可能不会开始写入(相应地读取)同一页面,直到 A 完成其读取(相应地写入)操作. 多个进程同时读取同一个页面当然是一个合法的条件,因为多个进程同时在不同的页面上执行任意操作(页面 P 上的进程 A,页面 Q 上的进程 B,页面 R 上的进程 C,等等。 )。
我的解释正确吗?
我可以假设 POSIX'read()和write()系统调用在上述意义上是“原子的”吗?我是否可以依靠这些具有一些内部逻辑的系统调用来根据文件描述符的位置和要读取或写入的块的指定大小来确定是否应该暂时阻止特定read()或write()调用?
如果上述问题的答案是“否”,我应该如何推出自己的锁定机制?
在我的schema.rb中,我有以下行:
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
Run Code Online (Sandbox Code Playgroud)
当我\di在psql中运行时,我得到:
Schema | Name | Type | Owner | Table
--------+--------------------------------------------------------------+-------+-------+-----------------------
public | index_users_on_email | index | alex | users
Run Code Online (Sandbox Code Playgroud)
但是,如果我在迁移中包含以下内容之一:
我收到以下错误:
rake aborted!
An error has occurred, this and all later migrations canceled:
Index name 'index_users_on_email' on table 'users' does not exist
Run Code Online (Sandbox Code Playgroud)
我也发现了这个问题.那么任何想法?
ruby migration ruby-on-rails database-indexes rails-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
默认情况下唯一约束是索引吗?如果不是,那么在SELECT ... WHERE子句中使用唯一约束时是否具有与索引列相同的性能结果?
谢谢
mysql performance database-design unique-constraint database-indexes
人们通常说,当您创建索引时,它会使您的提取速度更快,但同时它们会减慢您的更新(删除、插入、更新)速度,因为每次更新索引都将被重新创建。
我有一个问题:如果数据库在更新操作后更新其索引并从查询返回,那么这如何减慢查询执行速度?
由于查询在更新索引后的正常时间返回。我们可能会说,索引可能会导致数据库内部维护工作增加,但不应增加更新查询时间。
我陷入了一个设计不佳的系统中。现在我正在他们的数据库上做DBA,我有很多像下面这样的情况(伪代码):
Table t1{
c1;
c2;
c3;
c4;
key(c1);
key(c2);
key(c1,c2);
key(c1,c2,c3);}
Run Code Online (Sandbox Code Playgroud)
单列索引真的有必要吗,因为我已经有一个包含这些列的多列索引?
或者另一方面 - 是否需要多行列,因为我已经有了单列列?
问题是我一直在一个相当简单的查询上获得 seq 扫描,这是一个非常简单的设置。我究竟做错了什么?
constraint_exclusion = partition这是创建语句:
CREATE TABLE A (
K int NOT NULL,
X bigint NOT NULL,
Date timestamp NOT NULL,
fy smallint NOT NULL,
fz decimal(18, 8) NOT NULL,
fw decimal(18, 8) NOT NULL,
fv decimal(18, 8) NULL,
PRIMARY KEY (K, X)
) PARTITION BY LIST (K);
CREATE TABLE A_1 PARTITION OF A FOR VALUES IN (1);
CREATE TABLE A_2 PARTITION OF A FOR VALUES IN …Run Code Online (Sandbox Code Playgroud) postgresql query-optimization database-partitioning database-indexes postgresql-11
我在让 SQLite 为表达式建立索引时遇到问题。具体来说,我想在 JSON 对象中的特定属性上创建索引。
CREATE TABLE test (tags JSON);
INSERT INTO test VALUES(JSON_OBJECT('someKey', 'someValue'));
CREATE INDEX test_idx ON test(JSON_EXTRACT(tags, '$.someKey'));
EXPLAIN QUERY PLAN SELECT JSON_EXTRACT(tags, '$.someKey') FROM test;
Run Code Online (Sandbox Code Playgroud)
这个查询计划说:
扫描表测试
我所期待的是某种SEARCH TABLE test USING INDEX...。
关于如何纠正这个问题有什么想法吗?
database-indexes ×10
sql ×3
mysql ×2
postgresql ×2
algorithm ×1
b-tree ×1
concurrency ×1
database ×1
delayed-job ×1
migration ×1
performance ×1
posix ×1
ruby ×1
sqlite ×1