搜索引擎进行信息检索的优化策略方法(查询过慢需要优化三部分:查询优化、库表结构优化)
优采云 发布时间: 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 消耗等。
重复查询相同的数据。
比如在用户评论的地方,如果有多条评论,可以缓存当前用户头像,从缓存中取出多条评论。