类似mysql的查询耗时太长

类似mysql的查询耗时太长,mysql,sql,indexing,Mysql,Sql,Indexing,SQL: 用户索引: SELECT COUNT(usr.id) as `total_results` FROM users as usr LEFT JOIN profile as prof ON prof.uid = usr.uid WHERE usr.username LIKE '%a%' OR

SQL:

用户索引:

        SELECT
            COUNT(usr.id) as `total_results`
        FROM
            users as usr
            LEFT JOIN profile as prof
                ON prof.uid = usr.uid
        WHERE
            usr.username LIKE '%a%'
            OR
            prof.name LIKE '%a%' 
配置文件上的索引

uid - uid
username - username
说明:

index1 - uid
index2 - uid,name
index3 - name
上面的查询大约需要0.1221


如何使它运行得更快?

LIKE子句中的首字母
%
表示不能使用这些列的索引。我相信可以做你想做的事。

它尽可能多地使用索引(两个主键都用于左连接)。主要问题类似于“%a%”,因为在这种情况下,它不能使用索引(如果是“a%”,它将能够对用户名和名称使用索引)。您可以尝试(不确定这是否会加快速度)使用concat(usr.username,prof.name),比如“%a%”,但您可能不会注意到任何差异

全文索引不起作用,因为在搜索整个单词时,全文索引很有用

无论如何,对于查询,您在name和username上的索引是无用的,只会占用空间,所以我会删除它们。如果“a%”满足了您的需要,那么这些索引就有意义了


如果“a%”不能满足您的需要,您可以查看其他选项,例如mysql查询缓存(如果您希望频繁重复查询)。

要匹配的字符串开头的%使其匹配,因此无法使用索引。开头的通配符会使索引为空,MySQL必须在该列中的每一行中进行搜索。它不能往下跳。如果知道要搜索的项将位于字段开头的开头,则可以删除开头“%”

但是,如果您正在搜索“steve”,我的答案将返回“steve”、“steven”、“steve boss”,而不是“boss steve”或“realsteve”。

1)购买更快的数据库服务器


2) 重新设计数据库,这样您就不必在两个地方查找用户名,也不必只允许用户搜索其中一个

我删除了此查询,这样在搜索完成时它就不会显示结果总数


似乎是一个临时解决方案,甚至是永久解决方案。

删除
%%
上的起始
,例如
您试图实现的目标是什么?您是否真的试图统计所有名称或用户名中包含字母“a”的条目?@LiquiorVicar是的,我正在尝试获取搜索记录的数量,但您在搜索什么?在任何位置的任一字段中是否存在单个字母?两个字段是否以单个字母开头?或者搜索词可能不止一个字母?请提供一些现实的样本数据和样本结果。以及每一个可能的搜索关键字,短语等。。。基本上,我是在尝试获取数据库记录,其中包含关键字或阶段,如用户名或完整名称。我使用的搜索方法是否有问题,或者没有任何加快速度的方法?不敢相信没有任何方法……据我所知,没有办法写得更快,并且保持相同的语义。那么其他网站如何使用搜索?有没有更好的方法可以使用?@fxuser-其他网站不只是搜索一个字符。像谷歌这样的大型网站不使用特定于这种搜索的关系数据库。对于这一点,最好的方法是全文索引,但它的工作原理与只搜索单个索引不同char@fxuser如果您想搜索包含字符“a”的所有用户,那么在MySQL中没有更快的方法。您必须升级硬件或重新设计数据库。老实说,18k记录的1s查询似乎也没有那么慢。当我想从搜索中获得记录数时,问题就来了。。。如果在我的搜索中有500万条记录呢?可能需要10分钟来获取计数并显示它。线性扩展大约需要30秒。而计数部分是不相关的,真的,不知道你为什么要提出来。查询所花费的绝大多数时间是扫描整个表并检查类似条件。无论是5场比赛还是500万场比赛,这里都没有多少因素。仅显示表中记录的总数。
id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY     usr     ALL     NULL    NULL    NULL    NULL    18387   
1   PRIMARY     prof    ref     index2,index1   index2  8   site.usr.uid    1   Using where
2   DEPENDENT SUBQUERY  sub     ref     i3,index1,index2    i3  16  site.usr.uid,const  1   Using index