請注意,我問這個問題上dba.stackexchange.com,但我想我會後在這裏太:子查詢的執行慢時沒有匹配
在MySQL中,我有兩個基本的表格 - 帖子和關注:
CREATE TABLE Posts (
id int(11) NOT NULL AUTO_INCREMENT,
posted int(11) NOT NULL,
body varchar(512) NOT NULL,
authorId int(11) NOT NULL,
PRIMARY KEY (id),
KEY posted (posted),
KEY authorId (authorId,posted)
) ENGINE=InnoDB;
CREATE TABLE Followers (
userId int(11) NOT NULL,
followerId int(11) NOT NULL,
PRIMARY KEY (userId,followerId),
KEY followerId (followerId)
) ENGINE=InnoDB;
我有以下查詢,這似乎是優化不夠:
SELECT p.*
FROM Posts p
WHERE p.authorId IN (SELECT f.userId
FROM Followers f
WHERE f.followerId = 9
ORDER BY authorId)
ORDER BY posted
LIMIT 0, 20
EXPLAIN
輸出:
+------+--------------------+-------+-----------------+--------------------+---------+---------+------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------------+-------+-----------------+--------------------+---------+---------+------------+------+--------------------------+
| 1 | PRIMARY | p | index | NULL | posted | 4 | NULL | 20 | Using where |
| 2 | DEPENDENT SUBQUERY | f | unique_subquery | PRIMARY,followerId | PRIMARY | 8 | func,const | 1 | Using index; Using where |
+------+--------------------+-------+-----------------+--------------------+---------+---------+------------+------+--------------------------+
當followerId
是一個有效的id(意思是說,它實際上存在於兩個表中)時,查詢執行幾乎是立即的。但是,當表中沒有id時,查詢僅在7秒延遲後返回結果(空集)。
這是怎麼發生的?有沒有辦法在沒有匹配的情況下加快查詢速度(而不必提前檢查)?
能否請您提供一個具體的例子澄清? 「EXISTS」查詢不能用作「IN」的直接替換;此外,雖然我明白你在說什麼,但如果你能提供實際的查詢(以及對錶格所做的任何更改),這將會有所幫助。 – Melllvar
'選擇頁。* FROM 帖子p WHERE EXISTS(SELECT * FROM關注WHERE p.authorid = Followers.userId AND followers.followerId = 9) ORDER BY張貼 LIMIT 0,20' – evanv
在實際的變化方面到表格: 'ALTER TABLE跟隨者DROP KEY followerId;' 'ALTER TABLE關注者ADD KEY follower_user(followerId,userId);' – evanv