我对一个大型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)上的索引,您确实应该拥有它们。

但是,似乎LONGLAT会导致您遇到最多的问题。您应该尝试将LONGLAT保留为(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上使用范围搜索。

09-11 20:15