我有一个NewsStories表,我把它和一些相关的表连接在一起。每个News故事可以有多个图像、类别和地址。因此,查询实质上是:
SELECT * FROM NewStories
LEFT JOIN Images ON Newstories.id=Images.story_id
LEFT JOIN Categories ON NewsStories.id=Categories.story_id
LEFT JOIN Addresses ON NewsStories.id=Addresses.story_id
WHERE ...通常每个故事有几个图像和地址,以及1到2个类别。NewsStories表大约有10,000篇文章。
问题是性能相当慢(在15-20秒的数量级,尽管它确实变化很大,有时会下降到5秒)。
我想知道是否有更好的方法来组织查询以加快速度(我对SQL还很陌生)。
特别是,将给定故事的行数乘以图像数乘以地址数乘以类别数似乎是相当浪费的。
从本质上讲,我试图将新闻故事的属性重新构建为一个可以在前端操作的对象。
这里是解释(如果格式不正确,很抱歉)。我猜我没有正确地索引地址,如果它是“使用where”。对吗?
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Addresses ALL NULL NULL NULL NULL 6640 Using where
1 SIMPLE NewsStories eq_ref PRIMARY PRIMARY 767 NewsStories.Addresses.story_id 1 Using where
1 SIMPLE Images ref PRIMARY PRIMARY 767 NewsStories.NewsStories.id 1 Using index
1 SIMPLE Categories ref PRIMARY PRIMARY 767 NewsStories.NewStories.id 1发布于 2011-10-12 14:02:21
CREATE UNIQUE|FULLTEXT|CREATE index_name index_type ON tbl_name (index_col_name,...)index_type
index_col_name: col_name (长度)
哈希:使用{BTREE |index_type}
没有连接是针对视图的,而不是针对实际的表
参考文献:
发布于 2011-10-12 13:40:42
确保您的表被正确索引。您需要为用于选择数据的每一列创建索引,否则MySQL将遍历表中的每一行。
尝试在MySQL控制台中解释查询(EXPLAIN SELECT * FROM ...etc),以了解MySQL如何在内部处理表。将结果粘贴到您的问题中以获得其他帮助。
https://stackoverflow.com/questions/7735703
复制相似问题