今天小杨给大家分享一篇关于数据库查询优化,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。无论是小白还是职场的老手,都是必须掌握的一个手段。如果你对此了解不多,这块内容还是好好看看!
第一步:找到那些查询速度慢的语句

开启慢日志查询:这个主要是帮我们收集时间较长的SQL语句,需要在配置文件my.cnf里面设置查询的时间(long_query_time),以及存储的路径(slow_query_log_file),并对其开启(slow_query_log)。对上面参数配置完成后,执行语句,查看是否开启,下图为开启的结果:<br>

show variables like 'slow_query%';

  

 第二步:对找到的sql进行分析
1、 使用mysql的explain分析语句的状态:

如上图,explain出来的信息有十多列,通过key列的值,我们可以看到使用到的索引,如果没触发到索引的话,可以查看上篇文章,尽可能的触发索引。

2、 如果开启了show profile,该功能默认是关闭的,使用前需开启。

show variables like 'profiling'; 

SHOW PROFILES

可以通过上面的语句 Duration 列观看耗时

show profile cpu,block io for query id;/*id为show profiles列表中的Query_ID*/ 

也可以通过上面的语句,查看该语句更为具体的参数进行判断

第三步:找到问题的后对其进行性能的优化
1. 开启MySQL的查询缓存

这个可以有效的提高查询性能,当相同的查询被执行多次的时候,这些查询的结果会被放到缓存中,后续的查询直接返回缓存的结果。但是也有一些查询姿势会导致缓存无效,首先,想要查询缓存需要查询语句一样,另外条件查询中不能使用一些易变的函数,如NOW(),CURDATE()等

2. 为查询的字段建立索引

对经常查询的字段建立索引,当数据量大的时候,通过建立索引可以有效的帮我们提高查询的效率,但是也不是建太多的索引,不仅占磁盘,当我们插入和跟新的时候也需要去维护,影响效率

3. 尽量避免使用 `select *` 以及当查询一条数据的时候 用 `limit 1` 

从数据库读取太多数据的时候,会影响到速度以及网络传输的负载,所以尽量使用具体字段代替,覆盖索引。当我们知道只想要一条数据的时候,当使用 `limit 1`时,数据库引擎会在找到符合数据后停止往下搜索,从而提高效率

4. 字段设计的时候最好使用 `NOT NULL` 

首先NULL本身是需要占据存储空间的,另外一方面,当索引字段可以为NULL的时候,索引的效率会下降,除非你有特定的需要使用到NULL,不然还是尽可能的使用到 NOT NULL

5. 选择正确的存在引擎 MyISAM 和 InnoDB 

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

6. 对表进行水平拆分或者垂直拆分

- 水平拆分:当一张表的数据量大的时候(如登录表,用户表)随着时间的累加,数据量不断累加,这个时候我们可以将表拆分成多张表,对用户的名字或者id进行取模,从而分散存入到不同的表中,减少单表的压力
- 垂直拆分:当表的字段过多的时候,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能,这个时候可以考虑将一些字段拆分到多张表中,可以考虑下三大范式。这样可以降低表的复杂度和字段的数目,从而达到优化的目的。

7. 避免索引的失效

日常中,我们建立了索引了,但是姿势不对也可能让我们全表扫描,总结一些日常的坑

- like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
- where 等式的时候使用了进行函数、算术运算或其他表达式运算
- whre子句中使用!=或<>操作符、null值判断、使用 or 来连接条件,索引失效少用
- 使用联合索引没有遵守最左原则的时候,索引也无效

共同进步,学习分享

欢迎大家关注我的公众号【写代码的小杨】,相关文章、学习资料都会在里面更新,整理的资料也会放在里面。

觉得写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

MySQL数据库性能优化该如何入手的更多相关文章

  1. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  2. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  3. MySQL数据库性能优化专题

    摘录: 书:<MySQL性能调优与架构设计> 一个系列: (按顺序排一下) MySQL 数据库性能优化之缓存参数优化 http://isky000.com/database/mysql-p ...

  4. MySQL 数据库性能优化之缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  5. MySQL数据库性能优化:表、索引、SQL等

    一.MySQL 数据库性能优化之SQL优化 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础 优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地 ...

  6. MySQL数据库性能优化与监控实战(阶段四)

    MySQL数据库性能优化与监控实战(阶段四) 作者 刘畅 时间 2020-10-20 目录 1 sys数据库 1 2 系统变量 1 3 性能优化 1 3.1 硬件层 1 3.2 系统层 1 3.3 软 ...

  7. 浅谈MySQL 数据库性能优化

    MySQL数据库是 IO 密集型的程序,和其他数据库一样,主要功能就是数据的持久化以及数据的管理工作.本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,日志缓存,索引缓存,innodb缓存 ...

  8. Mysql数据库性能优化(一)

    参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...

  9. MySQL数据库性能优化

    mysql查询优化: 1.新增字段索引,查询时若使用到or关键字,则两个字段都需建立索引才能生效 2.sql语句包含子查询,mysql会创建临时表查询结束后删除,影响效率,所以应尽可能使用join替代 ...

随机推荐

  1. 详细教程丨如何利用Rancher和Kong实现服务网格?

    服务网格(Service mesh)是当前新兴的架构模式,越来越受到人们的青睐.与Kubernetes一起,服务网格可以形成一个强大的平台,它可以解决在微服务集群或服务基础设施上发现的高度分布式环境中 ...

  2. 使用NVIDIA GRID vPC支持视频会议和算力工具

    随着2020年的发展,远程工作解决方案已成为许多人的新常态.企业正在寻找行之有效的解决方案,如虚拟桌面基础设施(VDI),以使他们的团队能够在任何地方安全地工作.然而,最新的算力和视频会议应用程序需要 ...

  3. python_request 使用jsonpath取值结果,进行接口关联

    一.jsonpath的安装 pip   install  jsonpath 二.使用举例 import jsonpath d1={"token":"hjshdsjhdsj ...

  4. 解决使用Git找不到.ssh文件夹的办法

    解决使用Git找不到.ssh文件夹的办法 首先生成git密钥 git config --global user.name "你的名字(最好是中文全名)" git config -- ...

  5. 「题解」NWRRC2017 Grand Test

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7025.gym101612G. 题意概述 给你一张有 \(n\) 个点 \(m\) 条边的无向图,无重边无自环, ...

  6. 使用ElementTree解析,操作xml

    一.最近在实际工作中需要对一部分接口进行测试,接口的入参与出参都是xml格式的数据,所以用到了python内部模块ElementTree对xml进行解析,并根据实际需求操作xml数据 二.代码示例 # ...

  7. csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」

    改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...

  8. 【模板】 RMQ求区间最值

    RMQ RMQ简单来说就是求区间的最大值(最小值) 核心算法:动态规划 RMQ(以下以求最大值为例) F[i,j]表示 从 i 开始 到i+2j -1这个区间中的最大值 状态转移方程 F[i,j]=m ...

  9. 万字长文详解HiveSQL执行计划

    Hive SQL的执行计划描述SQL实际执行的整体轮廓,通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑,掌握了执行逻辑也就能更好地把握程序出现的瓶颈点,从而能够实现更有针对性的优化.此外还 ...

  10. alert日志报错:ERROR: failed to establish dependency between database RACDB and diskgroup resource ora.DATA.dg

    一.打开数据库alert日志,发现有报错 ERROR: failed to establish dependency between database RACDB and diskgroup reso ...