首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql优化分页查询

mysql优化分页查询
EN

Stack Overflow用户
提问于 2012-09-20 22:42:48
回答 1查看 427关注 0票数 1

有没有人能帮我加宽这个查询?我找不到解决方案。

SELECT *,p.cat_id, cat_name FROM ( SELECT cat_id FROM categories ORDER BY cat_id LIMIT 700000, 10 ) o JOIN categories p ON p.cat_id = o.cat_id ORDER BY p.cat_id

这是非常快的表有800,000条记录,但我需要的是排序数据与order by子句和where claue也-分页。如果我使用order by,它会非常慢,或者结果不是有序的correctly>

代码语言:javascript
复制
SELECT *, p.cat_id, cat_name FROM(
    SELECT  cat_id
    FROM    categories
    LIMIT 700000, 10
    ) o JOIN    categories p
ON      p.cat_id = o.cat_id
ORDER BY p.cat_name

page 1
LIMIT 700000,5:
 id      name
 12525525   car
 15155151   carpet
 1521512i   zone

page 2
LIMIT 700005,5
 id        name
12525525   carefull
15155151   excellent
52151222   drive

我需要结果:

代码语言:javascript
复制
page 1 car 
carpet
drive 
excellent ... etc.


f.e. , this is very slow ofcourse >
SELECT *, p.cat_id, cat_name 
FROM    (
        SELECT  cat_id
        FROM    categories
        **ORDER BY cat_name**
        LIMIT 700000, 10
        ) o
JOIN    categories p
ON      p.cat_id = o.cat_id
ORDER BY p.cat_name

主键cat_id,自动增量I在表中的字段上有索引

非常感谢您的帮助或一些想法

EN

回答 1

Stack Overflow用户

发布于 2012-09-20 22:49:22

您不需要对同一个表执行JOIN,而且必须在内部查询中执行ORDER BY,以便使用外部查询中的WHWRE子句进行正确排序:

代码语言:javascript
复制
 SET @rownum = 0;
 SELECT t.*, t.rank as TableRank
 FROM
 (
    SELECT *,  (@rownum := @rownum + 1) as rank
    FROM categories c 
    ORDER BY c.cat_name
 ) t 
 WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
 AND (@PageNum * @PageSize)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12515106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档