我使用了一个在线工具来分析我的一个sql查询(“查询”使我花了很长时间才能完成)。
我的查询使用一个单词(在此示例中为“ dog。”),并在它从登录表(其中login.pid === qa.u)连接行数据时尝试在“ qa”表中找到它。
SELECT login.pid,login.name,
qa.id,qa.end,qa.react,qa.win,qa.stock,qa.num,qa.ratio,qa.u,qa.t,qa.k,qa.swipes,qa.d
FROM login,qa WHERE login.pid=qa.u AND (qa.k LIKE '%dog.%' OR qa.k='.dog.')
ORDER BY qa.d DESC LIMIT 0,15
我了解该工具告诉我的内容:
Argument with leading wildcard
An argument has a leading wildcard character, such as "%foo". The predicate with
this argument is not sargable and cannot use an index if one exists.
但是我不知道如何在不破坏或更改结果的情况下在'()'中使用索引...有人可以解释一下如何在查询条件中间使用索引吗?
我认为,如果这是不可持久的,那么结果会更快吗?
最佳答案
首先,学习使用现代的join
语法:
SELECT login.pid, login.name,
qa.id, qa.end, qa.react, qa.win, qa.stock, qa.num, qa.ratio, qa.u, qa.t,qa.k, qa.swipes, qa.d
FROM login join
qa
on login.pid = qa.u
WHERE (qa.k LIKE '%dog.%' OR qa.k = '.dog.')
ORDER BY qa.d DESC
LIMIT 0,15;
基本上,“可精简”是指您可以在特定表达式上使用索引(它不是英文单词,而是首字母缩写词)。
qa.k
上的表达式不能使用索引。这可能不会有所不同,具体取决于查询的查询计划。例如,如果引擎决定先扫描
login
表,然后在qa
中查找值,则索引将无济于事。但是,它可以帮助您走另一条路。坏消息是您不能在MySQL中使该表达式可扩展。好消息是您可以使用全文索引来做您想做的事情,甚至可以做更多。您可以here了解它们。需要注意的一点是,默认设置会忽略短词(最多三个字母)。因此,如果您实际上要搜索“ dog”,则需要更改默认设置。
顺便说一下,以下表达式可以在
qa.k
上使用索引:WHERE (qa.k LIKE 'dog.%' OR qa.k = '.dog.')
(我不确定MySQL是否会实际使用该索引,因为它有时会被
or
混淆。)关于mysql - 如何使此SQL不可靠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21828932/