Laravel whereIn查询未使用索引问题求助
问题:Laravel生成的WHERE IN查询未使用指定索引
我发现一条由Laravel生成的WHERE IN查询(推测来自with预加载),具体语句如下:
select * from `domain_platforms` where `domain_platforms`.`domain` in ('54.197.198.150', 'aadarsh.in', 'affiliatealmanack.com', 'alexa.chinaz.com', 'allwebsites.net', 'amazonsales.com.ua', 'amazonsales.ru', 'anjana.co.in', 'articleforge.com', 'askdim.com', 'besafe.in', 'besthostingprice.com', 'betalist.com', 'bird.userdetected.com', 'blog.driftly.app', 'brilliantio.net', 'cafemmo.club', 'class.koalix.co.il', 'click.convertkit-mail2.com', 'codetime.io', 'couponsale.in', 'couponseeker.com', 'cupofcopyaudits.com', 'dasar.in', 'digitalmarketingsupermarket.com', 'domain.vsw.jp', 'fatrank.com', 'frequently-asked-questions.info', 'grammar-teacher.com', 'grammarteacher.substack.com', 'hansika.co.in', 'hypeurls.com', 'income.net.in', 'indiehackers.com', 'indiestartups.co', 'infodiscounts.com', 'jasperpieterse.com', 'jaugmente.com', 'jens.marketing', 'kavita.pw', 'ketaki.co.in', 'listit.pw', 'love.net.in', 'lumeaseoppc.ro', 'muchmore.in', 'niche.surf', 'nichepursuits.com', 'nichesurfer.com', 'nichewit.com', 'nitter.namazso.eu', 'offbeatfreelancer.online', 'officialwebsites.in', 'onemanarmy.in', 'onlinefestival.in', 'onlinenewspaper.in', 'ppp.twaino.com', 'priyasha.pw', 'producthunt.com', 'productific.com', 'prousmanhussain.com', 'rankmakers.katlinks.io', 'region.co.in', 'richniches.com', 'rikreviews.com', 'roberto.digital', 'saashub.com', 'seothesis.com', 'seotoolbelt.co', 'seotoolview.com', 'site-checker.org', 'sitescrawl.com', 'skipblast.com', 'soumettre.fr', 'startupscrushing.com', 'surekha.co.in', 'sushila.pw', 'tgstat.ru', 'topdoma.in', 'toplist.co.in', 'topmillion.net', 'trendystartups.com', 'twaino.com', 'twisave.com', 'urldirectory.net', 'urllinking.com', 'webandseo.fr', 'webhorspiste.com', 'webmaster-freelance.net', 'webworker.club', 'wpeagle.com', 'zenspill.com', 'zeroniche.com')
执行EXPLAIN后,结果显示未使用任何索引,但我已为该表创建了多个索引,其中domain_platforms_domain_index索引本应被使用却未生效,请问这是什么原因?
可能的原因及解决办法
- IN子句值数量过多:当IN列表中的值占表总行数比例较高(通常20%-30%以上),数据库优化器会判断全表扫描比遍历索引更高效。你的IN列表包含近百个值,优化器可能选择了成本更低的全表扫描。可以减少IN中的值数量,或者用
FORCE INDEX(domain_platforms_domain_index)强制使用索引验证效果。 - 字段与值类型不匹配:检查
domain字段的类型和IN子句中值的类型是否一致。比如字段是CHAR类型但传入字符串长度不符,或存在隐式类型转换(如字段为INT却传入字符串),都会导致索引失效。用DESCRIBE domain_platforms查看字段类型,确认值类型匹配。 - 索引异常:可能索引未正确创建或已损坏。执行
SHOW INDEX FROM domain_platforms查看索引状态,确认domain_platforms_domain_index确实基于domain字段创建且状态正常。若异常,删除后重新创建:DROP INDEX domain_platforms_domain_index ON domain_platforms; CREATE INDEX domain_platforms_domain_index ON domain_platforms(domain); - SELECT * 导致回表成本过高:查询所有字段时,使用索引后需要回表获取大量数据,优化器可能认为全表扫描更高效。尝试只查询所需字段(如
SELECT id, domain FROM ...),覆盖索引无需回表,更可能被优化器选中。 - 统计信息过时:数据库优化器依赖统计信息制定执行计划,若统计信息过时,会导致决策错误。执行
ANALYZE TABLE domain_platforms更新表统计信息,让优化器重新评估。
内容的提问来源于stack exchange,提问作者user3118789
相关产品推荐
相关产品推荐

