假设我的查询是:

SELECT adstable.adid FROM `adstable`
inner join userstable on
(adstable.adid = userstable.adid)
WHERE adstable.desktopimp > 100
and adstable.mobileimp > 100
and adstable.userbal > 0.02
and adstable.realbal> 0.02
order by adstable.imptotal asc


我应该索引哪些列,以确保此查询的“覆盖索引”?

最佳答案

每个“广告”可以有多个“用户”吗?可以为零吗?如果两者都不是

SELECT  a.adid
    FROM  `adstable` AS a
    WHERE  a.desktopimp > 100
      and  a.mobileimp > 100
      and  a.userbal > 0.02
      and  a.realbal> 0.02
      AND  EXISTS (
        SELECT  *
            FROM  userstable
            WHERE  adid = a.adid
                  )
    order by  a.imptotal asc


不管这是一个更好的表述,都有以下指标:

userstable:  INDEX(adid)
adstable:    INDEX(imptotal) -- in case it is better to avoid the sort
             INDEX(desktopimp) -- in case it is most selective
             INDEX(mobileimp)
             INDEX(userbal)
             INDEX(realbal)


“覆盖”索引将包含查询中使用的所有adstable 6列。这相当笨重,而且用途可疑。

请提供SHOW CREATE TABLE-查看数据类型,引擎等可能会有帮助。

建立最佳索引时,请从与=比较的任何列开始。如果可以解决所有WHERE问题,请继续进入ORDER BY列。您没有这种情况,因为您没有使用=

10-06 15:51