好的,正如标题所述,查询在2天前运行良好,然后昨天突然该网站的加载速度非常慢。我将其追溯到几个查询。我可以添加一个似乎有帮助的索引,但是我无法弄清楚这个索引。我尝试在表上进行修复和优化,但无济于事。我不知道发生了什么太大的变化,以至于查询不到一秒钟就变成了20多秒钟。任何帮助将非常感激。
SELECT city
FROM listings LEFT JOIN agencies
ON listings.agencyid_fk = agencies.agencyid
WHERE listingstatus IN (1,3) AND appid_fk = 101 AND active = 1
AND auction IS NULL AND agencies.multilist = 1
AND notagency IS NULL
GROUP BY city
ORDER BY city;
我不确定如何导出解释查询结果以使其在此处可读,因此我只将其放在代码段中。单击运行以在html表中查看它。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE listings ref appid_fk,listingstatus appid_fk 2 const 21699 Using where; Using temporary; Using filesort
1 SIMPLE agencies eq_ref PRIMARY,active PRIMARY 2 mls2.listings.agencyid_fk 1 Using where
这是桌子...
列表表:
CREATE TABLE mls2.listings (
listingid INT(11) AUTO_INCREMENT NOT NULL,
appid_fk SMALLINT(3) NOT NULL DEFAULT '0',
agencyid_fk SMALLINT(3) NOT NULL DEFAULT '0',
listingstatus SMALLINT(3),
city VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_swedish_ci,
multilist TINYINT(1),
auction TINYINT(1),
PRIMARY KEY (listingid)
) ENGINE = myisam ROW_FORMAT = DEFAULT CHARACTER SET latin1;
代理商表:
CREATE TABLE mls2.agenciesx (
agencyid SMALLINT(6) AUTO_INCREMENT NOT NULL,
multilist TINYINT(4) DEFAULT '0',
notagency TINYINT(1),
active TINYINT(1),
PRIMARY KEY (agencyid)
) ENGINE = myisam ROW_FORMAT = DEFAULT CHARACTER SET latin1;
最佳答案
采纳以上评论后,请尝试将以下索引添加到表中...
INDEX(city,listingstatus,appid_fk,auction)
INDEX(active,multilist,notagency)
在这两种情况下,索引中各列的排列顺序可能会有所不同,因此请尝试一下,尽管代理商表中的行很少,以至于没有关系。
接下来,摆脱GROUP BY子句,并按如下所示编写查询。
SELECT DISTINCT l.city
FROM listings l
JOIN agencies a
ON a.agencyid = l.agencyid_fk
WHERE l.listingstatus IN (1,3)
AND l.appid_fk = 101
AND a.active = 1
AND l.auction IS NULL
AND a.multilist = 1
AND a.notagency IS NULL
ORDER
BY city;
注意:尽管与该特定问题无关,但您最初的问题表明此模式非常需要标准化。
关于mysql - 2天前mysql查询很好,今天 super 慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50038770/