2011-01-20 13 views
2

私は私のクエリを改善しようとしている、私はすべてのレコードの数をやっている特定のカテゴリにあるレコードをすべて表示するには、各カテゴリでいくつのページが必要になるかを数えます。Mysqlは、私のクエリの結合とインデックスについていくつかのアドバイスが必要ですまたラウンド(カウント(フィールド)/ 20 +1)

私は、クエリの速度を向上させるために探しています。私は結合とインデックスが最も効率的であるかどうかは100%確信していません。

私は5時にLIMITを試しましたが、違いはありません。相続人は、クエリが実行されている

相続人は私のクエリ

SELECT PageBase, round((count(pads.padid)/20) + 1) as totpages FROM 
categories, pads WHERE pads.catid = categories.catid AND 
`RemoveMeDate` = '2001-01-01 00:00:00' group by categories.catid LIMIT 50,50 

相続人は相続人

alt text

カテゴリテーブル

CREATE TABLE categories (
    CatID int(11) NOT NULL DEFAULT '0', 
    NewASP text NOT NULL, 
    `Specific` text NOT NULL, 
    PageBase varchar(50) NOT NULL, 
PRIMARY KEY (CatID), 
KEY PageBase (PageBase) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

の構造を説明

alt text

+0

通常、ページ番号はデータベースでは行われず、代わりに任意の種類のプログラミング言語を使用してアプリケーションレベルで実行します。 – ajreal

+0

EXPLAIN出力を表示します。クエリの前にEXPLAINを追加してもう一度実行してください。 COUNT式が間違っています。 20レコード分の2ページを返します。 'round((count(pads.padid)/ 20)+ 1)'を削除し、 'padid'を置いてもクエリが速くならないように、FLOOR((count(pads.padid)+19)/ 20) – RichardTheKiwi

+0

@ 。 – Jules

答えて

0

これらのいずれかが優れていますか? EXPLAIN出力を表示してください。

これはサブクエリになります。これはうまくいけばlimit節の後に実行されます。編集:それはそうではありません。

SELECT PageBase, 
    floor((ifnull((select count(*) from pads 
    where pads.catid = categories.catid 
    AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages 
FROM categories 
LIMIT 50,50 

これにより、50,50が完了することが強制され、うまく時間がかからず、50カウントのサブクエリが実行されます。

SELECT PageBase, 
    floor((ifnull((
     select count(1) from pads 
     where pads.catid = C.catid 
      AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages 
FROM (
    SELECT PageBase, CatID 
    FROM categories 
    LIMIT 50,50) C 

FYI、count(1)およびcount(*)は同じです。 count(pads.catid)は、カウントする前にpads.catidがnullの場合には機能しなくてはならないため、遅くなる可能性があります(このクエリではnullにはならないことがわかります)。

+0

うわーありがとうございます(私はプラス1も追加)です。しかし、私は困っている/その星が心配です、私はそのパッドを作ることはできますか? – Jules

+0

うーん、それを試して、遅く、おそらくそのキャッシュ? – Jules

+0

私はまだ+1に困惑していますか?どうして? – RichardTheKiwi

関連する問題