- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个表,由 Django ORM 生成 - core_instauser
和 core_instauser_followers
。请参阅下面的 CREATE TABLE 语句
查询让关注者少一些帐户并按某些列 (counts_followed_by) 排序需要超过 30 秒:
# SELECT
# T3."id"
# FROM "core_instauser_followers"
# INNER JOIN "core_instauser" T3 ON ("core_instauser_followers"."to_instauser_id" = T3."id")
# WHERE "core_instauser_followers"."from_instauser_id" IN (14275, 30533081)
# ORDER BY T3."counts_followed_by" DESC
# LIMIT 10;
id
--------
23358
17461
34360
34201
30624
12475
306799
19215
21042
27073
(10 rows)
Time: 32850.160 ms
但是如果添加条件,不改变结果,查询只需要 0.3 秒——快 100 秒:
# SELECT
# T3."id"
# FROM "core_instauser_followers"
# INNER JOIN "core_instauser" T3 ON ("core_instauser_followers"."to_instauser_id" = T3."id")
# WHERE ("core_instauser_followers"."from_instauser_id" IN (14275, 30533081) AND T3."count_media" > 0 AND
# T3."counts_follows" > -1 AND T3."counts_followed_by" > -1)
# ORDER BY T3."counts_followed_by" DESC
# LIMIT 10;
id
--------
23358
17461
34360
34201
30624
12475
306799
19215
21042
27073
(10 rows)
Time: 295.934 ms
表中的所有列都有索引。
为什么会这样?
创建表的SQL:
-- core_instauser
CREATE TABLE core_instauser (
id integer NOT NULL,
uid character varying(100) NOT NULL,
username character varying(100) NOT NULL,
full_name character varying(100) NOT NULL,
profile_picture character varying(255) NOT NULL,
counts_followed_by integer,
counts_follows integer,
count_media integer,
owner_id integer,
hidden boolean NOT NULL,
loaded boolean NOT NULL,
update_time timestamp with time zone,
has_avatar boolean,
follow_rate double precision,
deleted boolean NOT NULL,
bio text NOT NULL,
count_loaded_followers integer NOT NULL,
has_bio boolean,
has_full_name boolean,
has_website boolean,
website text NOT NULL
);
CREATE SEQUENCE core_instauser_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE ONLY core_instauser ALTER COLUMN id SET DEFAULT nextval('core_instauser_id_seq'::regclass);
ALTER TABLE ONLY core_instauser
ADD CONSTRAINT core_instauser_pkey PRIMARY KEY (id);
ALTER TABLE ONLY core_instauser
ADD CONSTRAINT core_instauser_uid_key UNIQUE (uid);
CREATE INDEX core_instauser_count_media_480f209b0ba2dbd4_uniq ON core_instauser USING btree (count_media);
CREATE INDEX core_instauser_counts_followed_by_33a853f6d98098dc_uniq ON core_instauser USING btree (counts_followed_by);
CREATE INDEX core_instauser_counts_follows_66136283704427b2_uniq ON core_instauser USING btree (counts_follows);
-- core_instauser_followers
CREATE TABLE core_instauser_followers (
id integer NOT NULL,
from_instauser_id integer NOT NULL,
to_instauser_id integer NOT NULL
);
CREATE SEQUENCE core_instauser_followers_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE ONLY core_instauser_followers ALTER COLUMN id SET DEFAULT nextval('core_instauser_followers_id_seq'::regclass);
ALTER TABLE ONLY core_instauser_followers
ADD CONSTRAINT core_instauser_followers_from_instauser_id_to_instauser_id_key UNIQUE (from_instauser_id, to_instauser_id);
ALTER TABLE ONLY core_instauser_followers
ADD CONSTRAINT core_instauser_followers_pkey PRIMARY KEY (id);
CREATE INDEX core_instauser_followers_f865d5f5 ON core_instauser_followers USING btree (from_instauser_id);
CREATE INDEX core_instauser_followers_f9b32b2c ON core_instauser_followers USING btree (to_instauser_id);
ALTER TABLE ONLY core_instauser_followers
ADD CONSTRAINT core_in_from_instauser_id_2ac1cc9fc9c44a79_fk_core_instauser_id FOREIGN KEY (from_instauser_id) REFERENCES core_instauser(id) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE ONLY core_instauser_followers
ADD CONSTRAINT core_inst_to_instauser_id_4236828dfe87cfb8_fk_core_instauser_id FOREIGN KEY (to_instauser_id) REFERENCES core_instauser(id) DEFERRABLE INITIALLY DEFERRED;
解释查询:
第一次没有附加条件的慢查询
# EXPLAIN ANALYZE SELECT
# T3."id"
# FROM "core_instauser_followers"
# INNER JOIN "core_instauser" T3 ON ("core_instauser_followers"."to_instauser_id" = T3."id")
# WHERE "core_instauser_followers"."from_instauser_id" IN (14275, 30533081)
# ORDER BY T3."counts_followed_by" DESC
# LIMIT 10;
Limit (cost=1.13..32396.65 rows=10 width=8) (actual time=37561.457..37683.384 rows=10 loops=1)
-> Nested Loop (cost=1.13..48956112.71 rows=15112 width=8) (actual time=37561.455..37683.369 rows=10 loops=1)
-> Index Scan Backward using core_instauser_counts_followed_by_33a853f6d98098dc_uniq on core_instauser t3 (cost=0.56..4942183.77 rows=31451512 width=8) (actual time=0.066..4153.129 rows=4492685 loops=1)
-> Index Only Scan using core_instauser_followers_from_instauser_id_to_instauser_id_key on core_instauser_followers (cost=0.57..1.39 rows=1 width=4) (actual time=0.006..0.006 rows=0 loops=4492685)
Index Cond: ((from_instauser_id = ANY ('{14275,30533081}'::integer[])) AND (to_instauser_id = t3.id))
Heap Fetches: 10
Total runtime: 37683.475 ms
(7 rows)
带有附加条件的快速查询
# EXPLAIN ANALYZE SELECT
# T3."id"
# FROM "core_instauser_followers"
# INNER JOIN "core_instauser" T3 ON ("core_instauser_followers"."to_instauser_id" = T3."id")
# WHERE ("core_instauser_followers"."from_instauser_id" IN (14275, 30533081) AND T3."count_media" > -1 AND
# T3."counts_follows" > -1 AND T3."counts_followed_by" > -1)
# ORDER BY T3."counts_followed_by" DESC
# LIMIT 10;
Limit (cost=1.13..36969.96 rows=10 width=8) (actual time=24.635..222.119 rows=10 loops=1)
-> Nested Loop (cost=1.13..35453106.76 rows=9590 width=8) (actual time=24.633..222.100 rows=10 loops=1)
-> Index Scan Backward using core_instauser_counts_followed_by_33a853f6d98098dc_uniq on core_instauser t3 (cost=0.56..5029740.19 rows=19958436 width=8) (actual time=0.037..60.866 rows=13387 loops=1)
Index Cond: (counts_followed_by > (-1))
Filter: ((count_media > (-1)) AND (counts_follows > (-1)))
-> Index Only Scan using core_instauser_followers_from_instauser_id_to_instauser_id_key on core_instauser_followers (cost=0.57..1.51 rows=1 width=4) (actual time=0.009..0.009 rows=0 loops=13387)
Index Cond: ((from_instauser_id = ANY ('{14275,30533081}'::integer[])) AND (to_instauser_id = t3.id))
Heap Fetches: 10
Total runtime: 222.208 ms
(9 rows)
第二个查询中的所有过滤列(count_media、counts_follows、counts_followed_by)的值都大于或等于 0,因此新条件不得影响最终结果
# SELECT count(*)
FROM core_instauser
WHERE counts_followed_by < 0 OR count_media < 0 OR counts_follows < 0;
count
-------
0
(1 row)
Time: 5.551 ms
最佳答案
当您添加 where 谓词时,您告诉优化器您只对特定行 (core_instauser) 感兴趣。
旧查询必须匹配 core_instauser 中的每一行。对于每个 rows=4492685 发现它必须检查另一个表是否匹配。
新查询将 core_instauser 表限制为仅获取 rows=13387,并且它只需要搜索其他表 13387 次。
添加 where 谓词时,您将获得与实际表相同或更少的行数。
现在回答您的问题,为什么不同的查询会得到相同的结果。在您的情况下,恰好只有 core_instauser 表中的那些行与 core_instauser_followers 匹配。答案可能不同。
我们可以将它与两袋带有数字的球进行比较。一袋有 1,2 和 3。另一个袋子有 1 和 2。
现在您加入袋子以获得匹配。
Select * from bag1 join bag2 on (number) will join two rows: 1 and 2.
现在限制 bag1 获取所有小于 3 的球:
select * from bag1 join bag2 where bag1.number < 3.
The result will not change.
关于sql - 为什么有时在 Postgresql 中添加查询条件来加速它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38637606/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!