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 拥有 2 个将 item 属性链接到集合的外键。我们提供 sproc sId(PK of collection),以便子查询返回特定集合中的所有 itemid,然后我们在 itemproperty 中使用 itemid(PK)。

有什么方法可以加快这个过程吗?

更新

我的问题完全是由于不正确的索引。一旦我知道要索引哪些列,一切都非常顺利!感谢您的帮助。

4

2 回答 2

1

好吧,鉴于它是查询,(您应该通过在服务器上的 teh propmpt 上运行它来证明这一点)

将查询从 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 回答