我在表的一个大约1500行的存储过程中运行了一个简单的选择(注意到下面)。
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数据库的服务器在规范上都没有受到挑战。我猜是查询本身。
集合项保存将项目属性链接到集合的2个外键。我们向sproc sId(PK of集合)提供信息,以便子查询从特定的集合中返回所有的itemid,然后在itemid属性中使用itemid(PK)。
有没有办法加快这一进程?
更新
我的问题完全是因为索引不正确。一旦我学会了要索引的列,一切都是非常平滑的!谢谢你的帮助。
发布于 2012-05-13 16:25:07
您可以尝试这样做,但是如果您的表缺少索引,它可能不会有多大帮助。
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-13 16:14:48
考虑到这是查询,(您应该通过在服务器上运行它来证明这一点)
将查询从sp中删除,并在其前缀中添加Explain,以查看查询执行计划是否符合confrm,但有些内容直接突出。
SELECT *
FROM itemproperty
inner join collectionitem on collectionitem.itemid = itemproperty.itemid and removed ='0000-00-00 00:00:00'以消除子查询。
是否删除日期时间,是否将其编入索引?
https://stackoverflow.com/questions/10573126
复制相似问题