gpt4 book ai didi

php - mysql什么会更快

转载 作者:行者123 更新时间:2023-11-29 02:47:55 26 4
gpt4 key购买 nike

目前对于我的网站,我的文章上有标签。

当我遍历文章列表时,我会为每一篇文章执行一个 mysql 查询来为它们收集类别标签列表,如下所示:

SELECT c.`category_name`, c.`category_id` 
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id = 8136
ORDER BY r.`category_id` = *IDHERE* DESC, r.`category_id` ASC
LIMIT 4

现在,想象一下我说一次显示 30 篇文章的页面,上面的查询将执行 30 次。我想这很糟糕。

我决定做的是在一个页面上创建一个包含所有 article_id 的数组,然后改为这样做:

SELECT c.`category_name`, c.`category_id`, r.article_id 
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id = 8136 OR r.article_id = 8130 OR r.article_id = 8127
OR r.article_id = 8125 OR r.article_id = 8123 OR r.article_id = 8120
OR r.article_id = 8119 OR r.article_id = 8117 OR r.article_id = 8116
OR r.article_id = 8112 OR r.article_id = 8107 OR r.article_id = 8106
OR r.article_id = 8037 OR r.article_id = 8104 OR r.article_id = 8103

然后我只使用 PHP 循环遍历从上面找到的数组,将 article_id 与当前文章匹配,如果匹配则回显 category_name。唯一的问题是现在我无法将每个 article_id 限制为 4 个。

新方法是更好还是更坏,还是两者都糟透了?

要使用的示例数据:

CREATE TABLE `articles_categorys` (
`category_id` int(11) NOT NULL,
`category_name` varchar(32) COLLATE utf8_bin NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `article_category_reference` (
`ref_id` int(11) NOT NULL,
`article_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `articles_categorys` (`category_id`, `category_name`) VALUES
(22, 'Site Info'),
(1, 'Editorial'),
(2, 'Review'),
(3, 'Interview'),
(4, 'Game Sale'),
(5, 'Steam'),
(6, 'Indie Game'),
(7, 'Crowdfunding'),
(8, 'Game Bundle'),
(9, 'Free Game'),
(10, 'MMO');

INSERT INTO `article_category_reference` (`ref_id`, `article_id`, `category_id`) VALUES
(15, 6231, 22),
(14, 6231, 1),
(16, 6231, 2),
(17, 6231, 3),
(18, 6231, 4),
(19, 6231, 9),
(20, 6231, 10);

最佳答案

对于 SQL,最好对您的查询进行基准测试和执行 EXPLAIN 以查看哪个速度更快。但根据经验,IN 可能会优于多个 OR。这仍然会给您留下将结果限制为每个四个的问题。与评论中所说的相反,获取所有数据然后使用 PHP 仅选择 4 个项目不是一个好主意。您可能会检索数千行而只显示一百行。

SET @rank=null, @val=null;
SELECT * FROM (

SELECT c.`category_name`, c.`category_id`, r.article_id,
@rank := IF(@val = r.article_id, @rank+1,1) as rank,
@val := r.article_id
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id IN (8136, /* fill this up accordingly */)

ORDER BY r.`category_id` ASC
) AS a WHERE rank < 5;

有关更多详细信息,请参阅此出色的问答:Using LIMIT within GROUP BY to get N results per group?

简而言之,这个查询所做的就是为每条记录分配一个等级。开始时排名为空,对于第一行,它将被设置为空。虽然 r.category_id 保持不变,但它会继续增加,但会在 category_id 更改时回落到一个。

关于php - mysql什么会更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39605052/

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