gpt4 book ai didi

使用 ORDERBY 时 MySQL 慢连接查询

转载 作者:可可西里 更新时间:2023-11-01 07:04:06 24 4
gpt4 key购买 nike

我对这个查询有疑问:

SELECT a.*
FROM smartressort AS s
JOIN smartressort_to_ressort AS str
ON s.id = str.smartressort_id
JOIN article_to_ressort AS atr
ON str.ressort_id = atr.ressort_id
JOIN article AS a FORCE INDEX (source_created)
ON atr.article_id = a.id
WHERE
s.id = 1
ORDER BY
a.created_at DESC
LIMIT 25;

这个真的很慢,有时需要 14 秒。

EXPLAIN 展示这个:

1   SIMPLE  s   const   PRIMARY PRIMARY 4   const   1   Using index; Using temporary; Using filesort
1 SIMPLE str ref PRIMARY,ressort_id PRIMARY 4 const 1 Using index
1 SIMPLE atr ref PRIMARY,article_id PRIMARY 4 com.nps.lvz-prod.str.ressort_id 1262 Using index
1 SIMPLE a ALL NULL NULL NULL NULL 146677 Using where; Using join buffer (flat, BNL join)

所以最后一个“全部”类型真的很糟糕。但是我已经尝试过强制使用索引,但没有成功。

文章表如下所示:

CREATE TABLE `article` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`node_id` varchar(255) NOT NULL DEFAULT '',
`object_id` varchar(255) DEFAULT NULL,
`headline_1` varchar(255) NOT NULL DEFAULT '',
`created_at` datetime(3) NOT NULL,
`updated_at` datetime(3) NOT NULL,
`teaser_text` longtext NOT NULL,
`content_text` longtext NOT NULL,
PRIMARY KEY (`id`),
KEY `article_nodeid` (`node_id`),
KEY `article_objectid` (`object_id`),
KEY `source_created` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=161116 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

当我删除 FORCE INDEX 时,Explain 变得更好,但查询仍然很慢。

解释无力指数:

1   SIMPLE  s   const   PRIMARY PRIMARY 4   const   1   Using index; Using temporary; Using filesort
1 SIMPLE str ref PRIMARY,ressort_id PRIMARY 4 const 1 Using index
1 SIMPLE atr ref PRIMARY,article_id PRIMARY 4 com.nps.lvz-prod.str.ressort_id 1262 Using index
1 SIMPLE a eq_ref PRIMARY PRIMARY 4 com.nps.lvz-prod.atr.article_id 1

对于另一个 smartresort id(3),它看起来像这样:

1   SIMPLE  s   const   PRIMARY PRIMARY 4   const   1   Using index; Using temporary; Using filesort
1 SIMPLE str ref PRIMARY,ressort_id PRIMARY 4 const 13 Using index
1 SIMPLE atr ref PRIMARY,article_id PRIMARY 4 com.nps.lvz-prod.str.ressort_id 1262 Using index
1 SIMPLE a eq_ref PRIMARY PRIMARY 4 com.nps.lvz-prod.atr.article_id 1

在这里,我们有 13 个度假村对应一个 Smartresort。行数:1x1x13x1262x1 = 16.406

1) 我该怎么做才能使这个请求更快?

2) source_created 索引有什么问题?

最佳答案

查询中的 SELECT * 很丑陋,这通常会成为索引 killer 。它可以排除索引的使用,因为您定义的大多数索引不会覆盖 SELECT * 所需的每一列。这个答案的方法是索引查询中的所有其他表,因此会激励 MySQL 只对 article 表进行一次扫描。

CREATE INDEX idx1 ON article_to_ressort (article_id, ressort_id);
CREATE INDEX idx2 ON smartressort_to_ressort (ressort_id, smartressort_id);

这两个索引应该可以加快加入过程。请注意,我没有为 smartresort 表定义索引,假设它的 id 列已经是主键。我可能会从 article 表开始编写您的查询,然后向外连接,但这并不重要。

此外,强制索引通常不是一个好主意或没有必要。优化器通常可以确定何时最好使用索引。

关于使用 ORDERBY 时 MySQL 慢连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com