我对一个大型mysql查询(mysql 5.0)感到不安,我希望这里有人可以提供帮助。
之前我问过如何从联接的查询中获得不同的值
mysql count only for distinct values in joined query
我得到的响应(使用带有join as的子查询)
选择 *
来自媒体
内部联接
(选择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.link,
ext.source,ext.pre,meta,mdate.img
来自分机
右外连接(
SELECT 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'|')AS meta
来自媒体
在media.bid = users.bid上加入用户
LEFT JOIN标签on users.bid = tags.bid
-122.52224684058和-121.79760915942之间的`long`在哪里
和37.07500915942和37.79964684058之间
AND date ='2009-02-23'
GROUP BY media.bid,media.date
ORDER BY media.date,users.rank DESC
LIMIT 0、30
)mdate ON(mdate.bid = ext.bid AND mdate.date = ext.date)
phe!
因此,如您所见,如果我正确地理解了我的问题,那么我有两个没有索引的派生表(并且我不否认我可能以某种方式搞砸了Join语句,但是我一直在弄乱不同的类型,到此结束了给我想要的结果)。
创建与此类似的查询的最佳方法是什么,这将使我能够利用索引?
敢说,我实际上还有一个表格可以在以后添加。
目前,我的查询需要0.8秒才能完成,但是我确定是否可以利用索引,这可能会更快。
最佳答案
首先,检查ext(bid, date)
,users(bid)
和tags(bid)
上的索引,您确实应该拥有它们。
但是,似乎LONG
和LAT
会导致您遇到最多的问题。您应该尝试将LONG
和LAT
保留为(coordinate
POINT
)
,在此列上创建SPATIAL INDEX
并进行如下查询:
WHERE MBRContains(@MySquare, coordinate)
如果由于某种原因而无法更改架构,则可以尝试创建将
date
作为第一个字段的其他索引:CREATE INDEX ix_date_long ON media (date, `long`)
CREATE INDEX ix_date_lat ON media (date, lat)
这些索引对于您的查询将更加有效,因为您在
date
上使用精确搜索,在axes
上使用范围搜索。