假设我的查询是:
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
列。您没有这种情况,因为您没有使用=
。