gpt4 book ai didi

mysql - 我的查询有什么问题(很慢)?

转载 作者:行者123 更新时间:2023-11-29 00:39:44 28 4
gpt4 key购买 nike

以下查询在具有大约 50 万行的表上执行需要 20 多秒:

SELECT images.id, images.user_id, images_locale.filename, extension, size, width, height, views, batch, source, status, images.created_at, images.category_id, title, short_description, long_description, alternate, slugs.name as slug, images_locale.slug_id, path_cache AS category_path, full_name, users.username
FROM images
JOIN images_locale ON images_locale.image_id = images.id JOIN slugs ON images_locale.slug_id = slugs.id JOIN categories_locale ON images.category_id = categories_locale.category_id JOIN users ON users.id = images.user_id
WHERE slugs.name = 'THE_SLUG_HERE' AND images.status = '1' AND images_locale.locale_id = 1 AND categories_locale.locale_id = 1
LIMIT 1

现在,当我删除 slugs.name = 'THE_SLUG_HERE' AND 时,我会在几毫秒内得到结果。

这是我的 slug 表:

CREATE TABLE `slugs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(250) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`type` tinyint(4) NOT NULL,
`locale_id` smallint(6) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3611900 DEFAULT CHARSET=utf8;

我尝试CREATE INDEX test_speed ON slugs(name) 但它并没有加快速度。

请帮忙。

编辑:

这里是 EXPLAIN 的结果:

result of <code>EXPLAIN</code>

最佳答案

将所有可能的条件移动到连接的 ON 子句中:

SELECT ...
FROM images
JOIN images_locale ON images_locale.image_id = images.id
AND images_locale.locale_id = 1
JOIN slugs ON images_locale.slug_id = slugs.id
AND slugs.name = 'THE_SLUG_HERE'
JOIN categories_locale ON images.category_id = categories_locale.category_id
AND categories_locale.locale_id = 1
JOIN users ON users.id = images.user_id
WHERE images.status = '1'
LIMIT 1

这样做的原因是 WHERE 子句过滤了所有 可能的连接的结果,但是如果您将条件移动到 ON 子句中,您可以避免加入所有您已经知道不需要的行的下表。

这可以避免进行 数百万 不必要的连接!

关于mysql - 我的查询有什么问题(很慢)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774137/

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