【夯实Mysql基础】记一次mysql语句的优化过程

  1. 【事件起因】



  今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多。

  一个sql是 链接了5个表同时使用了 2个 order by和 1个limit的分页 sql。

一个sql是上一个sql的count(*),即链接了5个表,当然没有limit了(取总数)。

  2. 【着手优化】



    1)【优化思路】

        第一条是 做client调用 service层的数据缓存

        第二条就是 优化sql本身。

        这里着重讲一下 优化sql本身

    2)【使用expain】

        使用 explain语句,查看该语句,

        

    

    看着没有啥毛病啊,使用到了索引,扫描的行数也多,一个 85行,一个338多行,其他的也都是 1行。

  

    3)【使用子查询优化】

        使用子查询进行优化,效果差不多,只能想别的办法

    4)【去掉order by排序】

        和同事讨论时,觉得原来的5张表该加的索引都加了,为什么速度慢呢,我说里面还做了排序处理。

        说者无心,听者有意。他说 你去掉排序试试,果然,去掉排序后,时间降到了 0.002秒,快了很多。

        但是order by排序为什么很慢呢,因为 order by的那个字段也是 有索引的。

    5)【创建联合索引】

        后来查询了下面这篇文章(mysql中提高Order by语句查询效率的两个思路分析)才知道, 如果查询出来的数据量很大的时候,order  by字段,必须和前面的where语句中的字段建立 联合索引才行,同事建立的索引顺序还得是 先是 where语句中的字段最后是 order by中的字段。

    6)【最终方案】 

        明白了道理,但是鉴于还得麻烦 DBA创建索引为 特定项目建立特定的索引也不划算。这部分数据一遍不经常变动,可以做成缓存的形式,就作罢了,但是 分析问题的思路和优化 sql order的过程还是有收获的

  3. 【参考资料】


     1)mysql中提高Order by语句查询效率的两个思路分析

     2)【夯实Mysql基础】mysql中提高Order by语句查询效率的两个思路分析

    

时间: 2024-10-13 19:12:12

【夯实Mysql基础】记一次mysql语句的优化过程的相关文章

【夯实Mysql基础】记一次mysql语句的优化过程!

1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使用了 2个 order by和 1个limit的分页 sql. 一个sql是上一个sql的count(*),即链接了5个表,当然没有limit了(取总数). 2. [着手优化] 1)[优化思路] 第一条是 做client调用 service层的数据缓存 第二条就是 优化sql本身. 这里着重讲一下

MySQL基础(二)——DDL语句

MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 2.基本的数据库对象包括哪些 3.建表语句 4.修改表结构的语句

mysql 基础篇5(mysql语法---数据)

6 增删改数据 -- ********一.增删改数据********* --- -- 1.1 增加数据 -- 插入所有字段.一定依次按顺序插入 INSERT INTO student VALUES(1,'张三','男',20); -- 注意不能少或多字段值 -- INSERT INTO student VALUES(2,'李四','女'); -- 插入部分字段 INSERT INTO student(id,NAME) VALUES(2,'李四'); -- 1.2 修改数据 -- 修改所有数据(建

Mysql基础之准备及DDL语句

SQL语言概述 SQL(Structured Query Language)语言的全称是结构化查询语言.数据库管理系统通过SQL语言来管理数据库中的数据.SQL语言分为三个部分:数据定义语言(Data Definition Language,简称为DDL).数据操作语言(Data Manipulation Language,简称为DML)和数据控制语言(Data Control Language,简称为DCL).DDL语句:CREATE.ALTER.DROPDML语句:update.insert

mysql基础(六)select语句

单表查询:     SELECT         [ DISTINCT ]         [SQL_CACHE | SQL_NO_CACHE]         select_expr [,select_expr ...]         [FROM table_references [ WHERE where_condition ]         [GROUP BY {col_name | expr |}] [HAVING where_condition]  [ORDER BY [ASC |

mysql基础(八)mysql日志

mysql日志类型:     1.查询日志(通常不会开启,也不建议开启)     2.慢查询日志(建议开启)     3.错误日志(建议开启)     4.二进制日志(建议开启)     5.中继日志     6.事务日志(帮助事务型存储引擎完成ACID测试) mysql> SHOW GLOBAL VARIABLES LIKE '%log%'; #查看和日志相关的变量     查询日志:      general_log=ON|OFF #是否开启查询日志 general_log_file=PAT

mysql基础(六)mysql事务

mysql事务:是一个独立的工作单元 事务必须通过ACID测试:     原子性(Atomicity):一个事务的所有操作要么全部成功执行,要么全部失败后回滚     一致性(Consistency):数据库总是从一个一致性状态转换成另一个状态     隔离性(Isolation):一个事务在做出的操作在提交之前,其他事务是不可见的,隔离有多种级别     持久性(Durability):一旦事务提交,其所做出的操作将永久保存在数据库中 事务的执行流程:     启动事务-->执行SQL语句--

Mysql大量插入数据时SQL语句的优化

1) 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据.     ALTER TABLE tblname DISABLE KEYS;    loading the data    ALTER TABLE tblname ENABLE KEYS;这两个命令用来打开或者关闭Myisam表非唯一索引的更新.在导入大量的数据到一个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率.对于导入大量数据到一个空的Myisam表,默认就是先导入数据然后才创建索引的,所以不用进行设置.

记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs

首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大人,在蘑菇街,集群分片,固态硬盘比不起. 转载请注明出处:https://www.cnblogs.com/NaughtyCat/p/elasticsearch-OOM-optimize-story.html  业务场景: 保存7天索引,每天有400G.发现ES时不时的OOM,和重启.当索引超过500