0

約 1,500 行のテーブルのストアド プロシージャで、単純な SELECT (後述) を実行します。

CREATE PROCEDURE `LoadCollectionItemProperty`(IN sId int(10))
BEGIN
SELECT *
FROM itemproperty
WHERE itemid IN
    (SELECT itemid
    FROM collectionitem
    WHERE collectionid = sId AND removed ='0000-00-00 00:00:00');
END 

この操作には約 7 秒かかります。ブレークポイントを挿入し、F11 を使用して、MySqlAdapter.Fill でラグが始まる場所を特定しました。私のコンピューターと MySQL データベースをホストしているサーバーの両方が、仕様に関して問題を抱えているわけではありません。クエリ自体だと思います。

collectionitem は、item プロパティをコレクションにリンクする 2 つの外部キーを保持します。サブクエリが特定のコレクションからすべての itemid を返すように sproc sId(コレクションの PK) をフィードし、itemproperty で itemid(PK) を使用します。

プロセスをスピードアップする方法はありますか?

アップデート

私の問題は完全に不適切なインデックス作成が原因でした。どの列にインデックスを付けるかがわかれば、すべてが非常にスムーズになります。ご協力ありがとうございました。

4

2 に答える 2

1

それがクエリであることを考えると、(サーバーのプロンプトで実行するだけでそれを証明する必要があります)

sp からクエリを切り取り、プレフィックスとして Explain を付けて、確認するクエリ実行計画を確認しますが、いくつかの点がすぐに目立ちます。

SELECT *
FROM itemproperty
inner join collectionitem on collectionitem.itemid = itemproperty.itemid and removed ='0000-00-00 00:00:00'

サブクエリを削除します。

日時が削除され、インデックスが作成されていますか?

于 2012-05-13T16:14:48.863 に答える
1

これを試すことはできますが、テーブルにインデックスがない場合はあまり役に立ちません。

BEGIN
SELECT *
FROM itemproperty i
WHERE exists
    (SELECT 1
    FROM collectionitem c
    WHERE collectionid = sId AND i.itemid = c.itemid AND removed ='0000-00-00 00:00:00');
END 
于 2012-05-13T16:25:07.493 に答える