我在一个大约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包含将itemproperty链接到集合的2个外键。我们提供了sproc sId(集合的PK),以便子查询返回特定集合中的所有itemid,然后我们在itemproperty中使用itemid(PK)。
有没有办法加快这个过程?
更新
我的问题完全是由于索引不当造成的。一旦我了解了要索引的列,一切都非常顺利!谢谢你的帮助。
答案 0 :(得分:1)
好吧,鉴于它是查询,(你应该通过在服务器上的提示运行它来证明)
将查询从sp中删除并用Explain作为前缀,以查看查询执行计划,但有些事情会直接脱离。
SELECT *
FROM itemproperty
inner join collectionitem on collectionitem.itemid = itemproperty.itemid and removed ='0000-00-00 00:00:00'
摆脱子查询。
删除了日期时间,是否已编入索引?
答案 1 :(得分: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