PostgreSQL 9.5.0
我有一个表,称为message_attachments
它有1931964
行。
我在该表中搜索一个键,那就是message_id
.
我还总是包含deleted_at
is NULL 语句(例如软删除)。
创建了一个索引:
CREATE INDEX message_attachments_message_id_idx
ON message_attachments (message_id)
WHERE deleted_at IS NULL;
Run Code Online (Sandbox Code Playgroud)
所以它应该直接匹配这个查询:
EXPLAIN ANALYZE
select *
from "message_attachments"
where "deleted_at" is null
and "message_id" = 33998052;
Run Code Online (Sandbox Code Playgroud)
但生成的查询计划如下所示:
Seq Scan on message_attachments (cost=0.00..69239.91 rows=4 width=149) (actual time=1667.850..1667.850 rows=0 loops=1)
Filter: ((deleted_at IS NULL) AND (message_id = 33998052))
Rows Removed by Filter: 1931896
Planning time: 0.114 ms
Execution time: 1667.885 ms
Run Code Online (Sandbox Code Playgroud)
我在整个数据库中使用此类索引,但不知何故,它似乎不喜欢该特定表上的索引。
关于基数,最多有 5 列具有相同的值。
还在该表上运行了 ANALYZE …
基于对其他问题的多个答案,从Javascript调用本机C++是昂贵的.
我用节点模块"基准"检查了自己并得出了相同的结论.
一个简单的JS函数可以直接获得~90 000 000个调用,当调用C++函数时,我最多可以得到大约25 000 000个调用.这本身并没有那么糟糕.
但是当添加对象的创建时,JS仍然是大约7万次调用/秒,但是本机版本遭受了巨大的损失并且下降到大约2 000 000.
我假设这与v8引擎如何工作的动态特性有关,并且它将JS代码编译为字节代码.
但是是什么阻止他们对C++代码实现相同的优化呢?(或至少打电话/洞察什么会有帮助)