搜索引擎进行信息检索的优化策略方法(查询过慢需要优化三部分:查询优化、库表结构优化)

优采云 发布时间: 2022-02-17 08:12

  搜索引擎进行信息检索的优化策略方法(查询过慢需要优化三部分:查询优化、库表结构优化)

  查询太慢应该是MySQL中经常遇到的问题。今天,我就结合自己多年的开发经验来谈一谈。

  如果查询太慢,则需要优化三个​​部分:查询优化、索引优化、数据库表结构优化。首先要考虑的是查询语句的设计。

  首先,我们来看看为什么查询慢,为什么要花很长时间。如果将查询视为一项大任务,则该大任务由一系列子任务组成。因此,需要对子任务进行优化,提高子任务的执行效率,减少子任务的执行次数,以使子任务运行得更快。

  我们知道,一个查询的生命周期可以分为:客户端->服务器->服务器解析->生成执行计划->执行->返回结果给客户端。执行在整个生命周期中占据着最重要的位置(执行一般包括数据的检索、存储引擎的调用、数据的排序、数据的分组等)。

  查询慢主要是查询数据量大造成的。大多数太慢的查询可以通过减少查询的数据量来优化,例如增加对特定类别的搜索(经验法则)。对于太慢的查询,可以使用以下两条规则进行优化:

  1.是否访问了冗余数据(例如冗余行或列)

  2.确认MySQL是否分析了大量超出要求的数据行(比如一共100万行数据,分页返回时,每页只有10条数据,只需要分析这10条数据)

  让我们详细看看这两个规则

  有些查询会查询到冗余数据,查询这些数据会占用网络开销(无论应用程序和数据库是否在同一台服务器上,都会增加一定的网络开销)。并且会消耗一定的服务器内存资源和CPU。

  查询不需要的记录

  有些人经常错误地认为 MySQL 只会返回所需的数据。事实上,MySQL 会返回所有的结果集进行计算。比如有人写了一条语句查询所有列,然后获取前N行来关闭结果集。这是一个低效的查询,因为客户端应用程序(例如 PHP)将接收所有结果集,然后过滤掉大于 N 行的数据,这会增加网络和 CPU 开销。解决这个问题的一个简单有效的方法是在查询后面加上LIMIT。

  关联多个表时返回所有列

  例如,查询某个班级有多少学生。

  SELECT * FROM student INNER JOIN banji WHERE banji.id=3;

  上面的查询会返回2个表的所有内容,正确的写法如下

  SELECT student.* FROM student INNER JOINbanji WHERE banji.id=3;

  总是获取所有列

  尽量避免使用 select *. 每次看到select *要警惕,是否需要返回所有列?如果所有列都取完了,优化器将无法完成索引覆盖扫描,会带来额外的 I/O、内存和 CPU 消耗等。

  重复查询相同的数据。

  比如在用户评论的地方,如果有多条评论,可以缓存当前用户头像,从缓存中取出多条评论。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线