MySQL数据库中查询语句的优化
1,确定是否不需要从MySQL数据库中请求的数据,如以下内容:
(1)查询不需要的数据,例如,您需要10个数据,但您已经选择了100个数据,而这些数据是有限制的。
(2)当多个表关联时返回到所有列
(3)总是取出所有列,选择*。去掉所有的列,这样优化器就不能完成索引覆盖和扫描的优化,同时也会给服务器带来额外的I/O、内存和CPU消耗。
(4)重复查询相同的数据,例如,在用户评论中,我们需要查询用户头部的URL。当用户多次评论时,他们会缓存数据,并在需要时从缓存中提取数据,这样性能会更好。
2,MySQL是否正在扫描额外记录
查询开销最简单度量的三个索引如下:响应时间、扫描行数、返回的行数
响应时间:服务时间和排队时间。服务时间是数据库真正处理这个查询的时间。排队时间是服务器由于等待某些资源而不能真正执行的查询。
返回的行数和行数:理想情况下要扫描的行数和返回的行数应该相同。
一般MySQL可以使用以下三种方法来应用条件记录,从好到坏:
(1)索引中使用的位置条件来过滤不匹配的记录,并在存储索引层中完成。
(2)索引覆盖扫描用于返回记录,从索引直接筛选不必要的记录,并返回在MySQL服务器级别上完成的命中结果,但不需要查询返回表中的记录。
(3)从数据表返回数据,然后在MySQL服务器级别过滤和完成不符合要求的记录。首先,我们需要从数据表中读取记录,然后进行筛选。
如果您发现查询需要扫描大量数据,但返回几行,您通常可以尝试以下技术:
(1)使用索引覆盖扫描将所有必需的列放入索引中,这样存储引擎就可以返回结果而不必返回表来获得相应行。
(2)更改库的结构,并使用单独的汇总表。
(3)重写这个复杂的查询
三.重构查询的方法
(1)复杂查询或一些简单查询:
可以将MySQL每秒的内存中的数百万个数据进行比较,扫描后,MySQL响应数据向客户机要慢得多,当其他条件相同时,用最少的查询肯定是好的,但有时大的查询分解成多个小查询是非常必要的。
(2)。
删除旧数据是一个很好的例子,在经常删除大量数据的情况下,如果一次性大的完整语句,可能会锁定一次大量数据,填满整个事务日志。耗尽系统资源,阻塞许多小而重要的查询。
MySQL > deletefrommessageswherecreated < date_sub(现在的(),interval3month);
重写:
rows_affected = 0;
做{
rows_affected = do_query(
deletefrommessageswherecreated < date_sub(现在的(),interval3month);
)
}
(3)分解关联查询:
它可以使缓存更高效,并且可以轻松地在应用程序中缓存单个数据。
在查询被分解后,执行单个查询可以减少锁的竞争。
在应用层,它更容易分割数据库,使其更容易实现高性能和高扩展性。
查询本身效率更高。
它可以减少冗余数据的查询,在应用层进行相关查询,也就是说,对于某些数据应用程序,只需要查询一次,而在数据库查询中,则可能需要反复访问一些数据。
适合现场:
(1)当应用程序可以轻松地缓存单个查询的结果时;
当数据可以分布到不同的MySQL服务器时;
(3)当()可以代替关联查询时使用;
在查询中使用数据表时。