我在mySQL中编写了一个select语句。持续时间 50 秒,获取时间 206 秒。这是很长一段时间。我想理解我的查询部分效率低下,因此我可以改善其运行时间,但我不确定如何在mySQL中执行此操作。
我的桌子有超过1,000,000条记录。我也有一个内置的索引:
KEY `idKey` (`id`,`name`),
这是我的问题:
SELECT name, id, alt_id, count(id), min(cost), avg(resale), code from
history where name like "%brian%" group by id;
我已经查看了mySQL执行计划,但我无法从中找出错误:
如果我突出显示"全指数扫描"图片的一部分,我看到了:
Access Type: Index
Full Index Scan
Key/Index:
Used Key Parts: id, name
Possible Keys: idKey, id-Key, nameKey
Attach Condition:
(`allhistory`.`history`.`name` LIKE '%brian%')
Rows Examined Per Scan: 1098181
Rows Produced Per Join: 1098181
Filter: 100%
我知道我可以通过在查询中添加LIMIT 100
来扫描较小的数据子集,虽然它会缩短时间,但(28秒持续时间,0.000秒获取)我也希望看到所有的记录 - 所以我真的不想限制它。
对此主题更有见识的人是否可以建议我的查询,索引或方法可能对我想要完成的工作效率低下?
答案 0 :(得分:1)
我认为您的保险索引可能会倒退。尝试切换订单(名称,ID)。这样WHERE子句就可以利用索引。
答案 1 :(得分:1)
此问题仅在mysql全文搜索功能中有解决方案。
我不认为使用like
是可行的解决方案。表扫描不是具有数百万行的解决方案。
我在这个link中写了一个答案,我希望你找到一个可行的解决方案,通过这个参考和快速步行。
这是Full Text Search上的一个Mysql手册页。