【发布时间】:2010-10-09 09:46:54
【问题描述】:
我对一个大型 mysql 查询 (mysql 5.0) 感到头疼,我希望这里有人可以提供帮助。
之前我问过如何从联合查询中获取不同的值 mysql count only for distinct values in joined query
我得到的响应(使用带有 join as 的子查询)
选择 * 来自媒体 m 内部联接 (选择uid 来自 users_tbl 限制 0,30) 地图 在 map.uid = m.uid 内连接 users_tbl u 在 u.uid = m.uid不幸的是,我的查询变得越来越不守规矩,尽管我已经运行它,但加入派生表需要的时间太长,因为派生查询没有可用的索引。
我的查询现在看起来像这样
选择 mdate.bid, mdate.fid, mdate.date, mdate.time, mdate.title, mdate.name, mdate.address, mdate.rank, mdate.city, mdate.state, mdate.lat, mdate.`long`, 分机链接, ext.source、ext.pre、meta、mdate.img 从分机 右外连接( 选择 media.bid, media.date, media.time, media.title, users.name, users.img, users.rank, media.address, media.city, media.state, media.lat, media.`long`, GROUP_CONCAT(tags.tagname SEPARATOR ' | ') 作为元 来自媒体 在 media.bid = users.bid 上加入用户 LEFT JOIN tags ON users.bid=tags.bid 在 -122.52224684058 和 -121.79760915942 之间的“长” 和 37.07500915942 和 37.79964684058 之间的纬度 AND 日期 = '2009-02-23' GROUP BY media.bid, media.date ORDER BY media.date, users.rank DESC 限制 0, 30 ) mdate ON (mdate.bid = ext.bid AND mdate.date = ext.date)呼!
所以,如您所见,如果我正确理解了我的问题,我有两个没有索引的派生表(我不否认我可能以某种方式搞砸了 Join 语句,但我一直在搞乱不同的类型,这是否最终给了我想要的结果)。
创建与此类似的查询的最佳方法是什么,这将使我能够利用索引? 我敢说,我实际上还有一张桌子可以在以后添加到组合中。
目前,我的查询需要 0.8 秒才能完成,但我确信如果我可以利用索引,这可能会明显更快。
【问题讨论】:
-
在查看了 Quassnoi 使用 SPACIAL INDEX 的建议后,我意识到他们的索引中有一个错误,并且响应时间已大大缩短(现在为 0.1 秒)。但是,EXPLAIN 仍然指出我正在请求非索引列。
标签: mysql indexing derived-table