非常慢的MySQL搜索查询

非常慢的MySQL搜索查询,mysql,sql,performance,select,join,Mysql,Sql,Performance,Select,Join,我在做一个搜索引擎,我提出了正确的查询来获得我需要的信息。数据库很大(1gb),查询有时会使httpd服务器崩溃 运行此查询,另一个类似的查询用于分页(以确定页数),第三个查询用于总持续时间和调用量 所有这些加在一起会导致非常糟糕的性能。 下面是一个数据库示例 欢迎就如何提高绩效提出任何建议 我曾尝试在不同的查询中使用“视图”来缩小结果范围,但目前还没有成功。由于数据库的结构无法更改,而且通配符搜索需要很长时间,因此我决定使用 在视图中,我查询了所有按扩展分组的调用,之后我创建了另一个带有通配符

我在做一个搜索引擎,我提出了正确的查询来获得我需要的信息。数据库很大(1gb),查询有时会使httpd服务器崩溃

运行此查询,另一个类似的查询用于分页(以确定页数),第三个查询用于总持续时间和调用量

所有这些加在一起会导致非常糟糕的性能。 下面是一个数据库示例

欢迎就如何提高绩效提出任何建议


我曾尝试在不同的查询中使用“视图”来缩小结果范围,但目前还没有成功。

由于数据库的结构无法更改,而且通配符搜索需要很长时间,因此我决定使用

在视图中,我查询了所有按扩展分组的调用,之后我创建了另一个带有通配符搜索的视图(比再次遍历所有数据库快得多)


这也有助于总调用查询和分页。响应时间非常好。

您有哪些指标?连接是在主键上还是在声明的辅助键上?为了方便起见,我提供了一个SQLFIDLE,我在不考虑索引的情况下进行连接。在非索引字段上进行连接需要进行完整的表扫描。难怪您的查询速度很慢。您正在将like与“%”一起使用,因此无论发生什么情况,查询速度都会很慢,因为它需要遍历t1中的所有目标并将其与通配符字符串进行匹配。。。。很抱歉,除非您重新组织数据,将前缀与其他前缀分开,以避免mysql免费文本搜索,否则这不会很快,而
t1.starttime>=('2014-06-1')
中的日期不匹配任何大于2014-06-10且不带前导零的内容吗?
SELECT
    cast(t1.destination as unsigned) as prefix,
    t2.destination as destination,
    FORMAT(sum(t1.terminatecauseid = 1), 0) as calls,
    IFNULL(sec_to_time(avg(case when t1.terminatecauseid = 1 then t1.sessiontime end)), 0) as aloc,
    CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100 / count(*), 1), '%') as asr,
    sum(case when t1.terminatecauseid = 1 then t1.sessiontime end) as duration
FROM
    cc_call AS t1
        inner join
    cc_prefix as t2 ON t1.destination = t2.prefix
        inner join
    cc_country as t4 ON t1.destination like CONCAT(t4.countryprefix, '%')
WHERE
    t1.card_id = '133' AND t1.starttime >= ('2014-06-1')
group by t4.countryprefix
having duration is not null
order by duration DESC
LIMIT 0 , 25