Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 避免使用内部联接进行文件排序+;订购人_Mysql_Sql_Join_Sql Order By_Filesort - Fatal编程技术网

Mysql 避免使用内部联接进行文件排序+;订购人

Mysql 避免使用内部联接进行文件排序+;订购人,mysql,sql,join,sql-order-by,filesort,Mysql,Sql,Join,Sql Order By,Filesort,我一直在阅读其他帖子,但我没有设法解决我的问题 使用DESCorder,查询速度要慢20倍,我必须对此进行改进。 以下是查询: SELECT posts.post_id, posts.post_b_id, posts.post_title, posts.post_cont, posts.thumb, posts.post_user, boards.board_title_l, boards.board_title FROM posts INNER JOIN follow ON posts.pos

我一直在阅读其他帖子,但我没有设法解决我的问题

使用
DESC
order,查询速度要慢20倍,我必须对此进行改进。 以下是查询:

SELECT posts.post_id, posts.post_b_id, posts.post_title, posts.post_cont, posts.thumb, posts.post_user, boards.board_title_l, boards.board_title
FROM posts
INNER JOIN follow ON posts.post_b_id = follow.board_id
INNER JOIN boards ON posts.post_b_id = boards.board_id
WHERE follow.user_id =1
ORDER BY posts.post_id DESC 
LIMIT 10
以下是表格(已更新):

使用默认的
ASC
顺序,它只使用索引和where,而
DESC
使用索引、where、临时和文件排序。

id选择类型表类型可能的键参考行过滤额外
1简单跟随参考用户id用户id 4常数2 100.00使用索引;使用临时设备;使用文件排序
1个简单电路板eq_ref PRIMARY 4 xxxx.follow.board_id 1100.00
1简单帖子参考帖子id帖子id 4 xxxx.boards.board\u id 3 100.00使用where
如何使查询以
DESC
顺序接收结果,而不使用filesort和temporary

更新:我做了一个新的查询,没有临时或文件排序,但是类型:index,过滤:7340.00。如果帖子位于表的末尾,则几乎与ASC顺序一样快,但如果正在搜索的帖子位于表的开头,则速度较慢。所以看起来更好,但这还不够

SELECT posts.post_id, posts.post_b_id, posts.post_title, posts.post_cont, posts.thumb, posts.post_user, boards.board_title_l, boards.board_title 
FROM posts INNER JOIN boards ON posts.post_b_id = boards.board_id
WHERE posts.post_b_id
IN (
 SELECT follow.board_id
 FROM follow
 WHERE follow.user_id = 1
)
ORDER BY posts.post_id DESC 
LIMIT 10
说明:

id选择类型表类型可能的键参考行过滤额外
1主要职位索引职位id主要职位8空10 7340.00使用where
1个主电路板eq_ref PRIMARY 4 xxxx.posts.post_b_id 1 100.00
2依赖子查询使用索引遵循等式参考用户id用户id 8常量,func 1 100.00
更新:从以下位置解释查询:

id选择类型表类型可能的键参考行过滤额外
1主所有空10 100.00
1个小学门柱eq_ref小学门柱b_id小学4平方米门柱id 1100.00
1个主电路板eq_ref PRIMARY 4 xxxx.posts.post_b_id 1 100.00
2使用索引导出的参考小学4 1 100.00;使用临时设备;使用文件排序
2个衍生帖子参考帖子id帖子id 4 xxxx.follow.board\u id 6 100.00使用索引
次数:

原始查询无订单(ASC):0.187500秒
原始查询描述:2.812500秒
末尾的第二个查询帖子(DESC):0.218750秒
开始时的第二次查询帖子(DESC):3.293750秒
dened的查询描述:0.421875秒
dened的查询无订单(ASC):0.323750秒
有趣的是,如果我按ASC添加
订单
DESC
一样慢


改变餐桌秩序将是上帝的方式,但正如我在评论中所说,我无法做到这一点。

增加参数将增加MySQL在求助于临时磁盘文件之前使用的内存量,应该会有很大帮助。

您可以通过将所有过滤工作移到只访问索引的子查询来帮助MySQL optimizer(操作索引通常比操作其他数据快得多),并在最外层的查询中获取其余数据:

SELECT posts.post_id,
       posts.post_b_id,
       posts.post_title,
       posts.post_cont,
       posts.thumb,
       posts.post_user,
       boards.board_title_l,
       boards.board_title
FROM   (SELECT post_id
        FROM   posts
               JOIN follow
                 ON posts.post_b_id = follow.board_id
        WHERE  follow.user_id = 1
        ORDER  BY post_id DESC
        LIMIT  10) sq
       JOIN posts
         ON posts.post_id = sq.post_id
       JOIN boards
         ON boards.board_id = posts.post_b_id
请注意,我在外部查询中省略了orderbyposts.post_id DESC,因为在代码中对最终结果排序通常比使用MySQL查询排序更快(MySQL通常使用filesort)


另外,您可以用主键替换
follow
表中的唯一键。

这看起来不错。不确定您可以做什么:-(您可以在post_id上添加降序索引“InnoDB总是根据聚集索引对表行排序。”我尝试通过
post\u id
DESC更改表
posts
ORDER;并且它始终保持ASC状态,其他引擎可以使用DESC ORDER,但如果插入或删除任何行,它就不会保持顺序。为什么需要复合主键(
post\u id
post\u id
)对于
posts
表?
post\u id
AUTO\u INCREMENT
因此它是唯一的。在这种情况下,为什么不将
post\u id
作为主键呢?此时我不记得了,我更改了它。我想我昨天测试时添加了post\u id键。幸运的是,所有这些表加起来都小于250kb,我增加了排序缓冲区大小和其他缓冲区(从1mb开始)到16mb,在xampp上,结果相同。遵循主键。测试您的查询,无论帖子在哪里,速度都稳定,没有原始查询的速度快,没有顺序,但可能这是不可能的。@Vixxs,我稍微更改了查询。这应该快一点。此版本假定
帖子的主键是
(post\u id)
,但不是
(post\u id,post\u b\u id)
@Vixxs,如果答案有助于解决您的问题,请不要忘记将其标记为已接受。请参阅。如果对您有帮助,您也可以对任何答案进行投票。请参阅。确实有帮助,我会将您的答案标记为已接受,如果没有其他更好的答案,我会记住。我将继续处理此查询。@Vixxs,al因此,请尝试将唯一键
(post\u b\u id,post\u id)
(按此特定列顺序)添加到
posts
。这可能会加快我的查询速度。
SELECT posts.post_id,
       posts.post_b_id,
       posts.post_title,
       posts.post_cont,
       posts.thumb,
       posts.post_user,
       boards.board_title_l,
       boards.board_title
FROM   (SELECT post_id
        FROM   posts
               JOIN follow
                 ON posts.post_b_id = follow.board_id
        WHERE  follow.user_id = 1
        ORDER  BY post_id DESC
        LIMIT  10) sq
       JOIN posts
         ON posts.post_id = sq.post_id
       JOIN boards
         ON boards.board_id = posts.post_b_id