mysql什么会更快

时间:2016-09-20 23:05:22

标签: php mysql

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

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

import json
my_dct = json.loads(json_string)

现在,想象一下我一次显示30篇文章的页面,上面的查询将完成30次。我想这太糟糕了。

我决定做的是在页面上创建所有article_ids的数组,然后执行此操作:

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

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

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

要使用的示例数据:

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

2 个答案:

答案 0 :(得分:1)

使用SQL,对您的查询进行基准测试并对其进行探索以查看哪个更快会更好。但根据经验,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?

简而言之,此查询的作用是为每条记录设置排名。在开始时,rank为null,对于第一行,它将被设置为null。虽然r.category_id保持不变,但它会继续增加,但当category_id发生变化时会回落到一个。

答案 1 :(得分:0)

有时候不足以做出好的查询,你必须使用SQL选项。 为了使您的查询更快,您应该使用索引(例如hash或btree)或唯一值https://www.tutorialspoint.com/mysql/mysql-indexes.htm