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 it を使用すると、非常に遅くなるか、結果が正しく順序付けされません>

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

結果が必要です:

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、自動インクリメント テーブルのフィールドにインデックスがあります

助けやアイデアをありがとう

4

1 に答える 1

0

JOIN同じテーブルにする必要はありませんでした。外側の句でORDER BY正しく順序付けられるように、内側のクエリで実行する必要があります。WHWRE

 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)
于 2012-09-20T14:49:22.230 に答える