MySQL优化六-优化慢查询

news/2024/7/7 19:18:47

本文主要总结,如何提升性能低下的查询。慢查询的基本原因是,访问的数据太多,而很多情况下不需要筛选大量数据。对于低效的查询,可通过以下两个步骤分析:

目录

一、是否检索到大量超过需要的数据,意味着访问了太多的行;

 1、查询不需要的记录

 2、多表关联时返回全部列

 3、总是返回全部列

4、重复查询相同的数据

二、mysql服务器层是否在分析大量超过需要的数据行。


一、是否检索到大量超过需要的数据,意味着访问了太多的行;

 1、查询不需要的记录

使用select 语句查询大量的结果,只需前N行,然后关闭数据集。实际情况mysql查询全部的数据集,客户端接收到全部的数据集,然后抛弃大部数数据。最简单的做法是加上limit。eg:

mysql> select * from payment limit 10;

 2、多表关联时返回全部列

mysql> select * from actor 
    -> inner join film_actor where actor_id = actor_id

这将返回三个表的全部列,而且容易造成相同列名的冲突,正确的方式 是只最需要的列

mysql> select t1.* from actor t1
    -> inner join film_actor t2 where t1.actor_id = t2.actor_id

 3、总是返回全部列

取全部列,会让优化器无法完成覆盖索引这类的优化,还会给服务器带来IO,内存和CPU的损耗。

4、重复查询相同的数据

不断地重复执行相同的数据,然后返回完全相同的数据。比较好的方案是,当初次查询的时候,将数据缓存起来,比如使用redis缓存,需要的时候从redis缓存取出来,这样的性能会更好。

二、mysql服务器层是否在分析大量超过需要的数据行。

 衡量查询开销的三个指标有:

1、响应时间

2、扫描的行数

3、返回的行数

第2、3点的访问类型,从慢到快,分别是:全表扫描、索引扫描、范围扫描、唯一索引扫描和常数引用等。

一般mysql能够使用如下三种方式应用where条件,从好到坏如下:

1、在索引中使用where条件过滤不匹配的记录。

2、使用索引覆盖扫描来返回记录(在extra列中出现了using index),直接从索引中过滤不需要的记录,并返回命中的记录。

3、从数据表中返回数据,然后过滤不满足的条件(在extra出现using where)。

以下总结了分析手段,接下来总结下做法。如果发现扫描大量数据但只返回少量行。通过以下三个方法优化 :

1、使用索引覆盖 扫描,把所有的列放在索引中,这样存储引擎无须返回表获取对应行就返回结果。

2、改变表结构,例如使用单独的汇总表。

3、重写这个复杂的查询,让优化器能以更优化的方式查询。


http://lihuaxi.xjx100.cn/news/1235493.html

相关文章

如何恢复u盘数据?数据恢复,就看这4个方法!

案例:每次清理u盘时,总是会不小心删除重要的数据,如何恢复u盘数据呢? 【u盘中的数据删除了还能恢复吗?我昨天想把u盘里一些不需要的图片和文件删除,但不小心删了些有用的数据,有什么方法可以帮我…

3.1 基于配置文件整合SSM框架实现用户登录

一、基于XML配置方式整合SSM框架实现用户登录 1、创建数据库与表 (1)创建数据库 数据库simonshop,采用utf8mb4编码 (2)创建用户表 创建用户表t_user CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,u…

DAY 74 ELK企业级日志分析系统

ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求 ELK各组件介绍 ElasticSearch: 是基于Lucene(一个全文检索引…

Unix Network Programming Episode 70

‘sctp_opt_info’ Function The sctp_opt_info function is provided for implementations that cannot use the getsockopt functions for SCTP. This inability to use the getsockopt function is because some of the SCTP socket options, for example, SCTP_STATUS, ne…

「最新」Parallels Desktop 18 for Mac(Pd虚拟机) 18.3.1通用版

Parallels Desktop 18是一款虚拟机软件,能够让Mac电脑上运行Windows、Linux和其他操作系统的应用程序。 此版本的Parallels Desktop 18提供了多项功能增强和改进,包括更快的性能、更好的图形处理、更简单的导入和导出虚拟机等。该软件还支持Apple M1芯片…

swagger实现在线接口文档

一、前言 之前换了新的单位后,单位的项目有使用到swagger,那个时候觉得这个好方便,后面是建立在他们搭建好的基础上使用一些swagger的注解,但一直想要自己去实现,奈何没有机会,这次机会终于来了&#xff0…

docker私有仓库的部署

1)什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based…

redis中的 adlist链表实现

adlist源码解读(基于redis 6.2.7) 1丶打开源码 adlist.h typedef struct listNode {struct listNode *prev;struct listNode *next;void *value; } listNode;//迭代时 使用 typedef struct listIter {listNode *next;int direction; 迭代方向 } listIter;typedef struct lis…