mysql(三) 慢查询分析(二)

在一般的查询中,都要求尽量围绕创建的索引进行。针对索引,常用的有主键索引,单列索引,组合索引,索引合并等。

在评价索引时,关键看区分度。索引区分度=索引列唯一值/表记录数。

如果在区分度很低的列上建索引,那索引扫描的rows会相当大,该索引的性能表现就基本接近全表扫描了。

  • 主键索引

是一种特殊的唯一索引,不允许有空值。

  • 单列索引

针对表的单一列设置索引。

  • 组合索引

针对表的多列按列顺序设置索引。在组合索引中,基于BTree的原理,存在一个最左前缀匹配原则。如下索引(mobile_price_create_index):

能用到索引的场景:

mobile=a时,可以用到索引的第一列。

mobile=a and create=c时,只能用到索引的第一列。

mobile=a and price=b时,可以用到索引的两列。

mobile=a and price=b and create =c时,可以用到索引的三列。

mobile=a and price > b and create=c时,可以用到索引的前两列。

mobile>a and price =b and create=c时,只能用到索引的第一列。

mobile=a and price=b and create>c时,可以用到索引的三列。

order by a时,可以用到索引。

mobile=a order by price时,第一列过滤,第二列排序,可以用到索引。

order by mobile desc,price desc时,此时两列排序顺序一致,可以用到索引。

mobile > a order by a时,范围查询在第一列,排序在第一列,可以用到索引。

用不到索引的场景:

price=b and create=c时,用不到索引。

order by b时,不能用到索引。

order by mobile desc,price asc时,此时两列排序顺序不一致,用不到索引。

mobile > a order by price时,范围查询在第一列,排序在第二列,第二列用不到索引。

这里要声明一个误区,参数的顺序不影响使用组合索引。mobile=a and price=b and create =c 与 create=c and price=b and mobile=a是等价的。

索引的创建要根据最常使用的参数来设定,使用时,要尽量贴合索引来实现逻辑。

  • 索引合并

针对单表的查询,可以支持查询条件使用多个索引,然后对查询结果进行交集,并集,有序并集等处理。

mysql支持在针对单表的查询时,合并多个索引的查询结果。

如下索引结构:

执行如下执行计划:

explain select * from trade_order where gmt_create >‘2018-06-02 13:25:23‘ or mobile =‘mobile-3679‘;

这个sql中使用了合并索引,分别针对gmt_create和mobile使用了2个索引。然后将其结果集求并集之后排序。

针对or的查询条件,组合索引不能起到有效的作用。此时可以通过在条件上建单独的索引,然后合并使用。

针对and的查询条件,创建组合索引效率更好,退而求其次时,可以选择创建多个索引,然后合并使用。

那如果出现慢查询,可以根据执行计划,看是否未命中索引,命中的索引区分度是否足够,组合索引是否满足最左前缀的原则,如果索引只能命中一部分,是否可以通过合并索引的方式改进sql。

原文地址:https://www.cnblogs.com/asfeixue/p/9128751.html

时间: 2024-08-28 17:24:21

mysql(三) 慢查询分析(二)的相关文章

MySQL的慢查询分析

慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ---在MySQL的当前版本中,慢查询日志是开销最低,精确度最高的测量查询时间的工具.如果还在担心开启慢查询会带来额外的I/O开销,那大可以放心,我们在I/O密集型场景做过测试,慢查询带来的开销可以忽略不计(实际上CPU密集型场景的影响还稍大一些) 更需要担心的是日志可能会消耗掉很大的磁盘空间,因

MySQL慢日志查询分析方法与工具

MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询 MySQL日志文件系统的组成   a.错误日志:记录启动.运行或停止mysqld时出现的问题.   b.通用日志:记录建立的客户端连接和执行的语句.   c.更新日志:记录更改数据的语句.该日志在MySQL

一次MySQL线上慢查询分析及索引使用

本文由作者郑智辉授权网易云社区发布. 0.前言 本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化.在两次处理问题过程中,进行的思考. 1.简要描述 在九月底某个新上的游戏业务MySQL慢查询日志 # Time: 2017-09-30T14:56:13.974292+08:00 # Query_time: 6.048835  Lock_time: 0.000038 Rows_sent: 0  Rows_examined: 1288441

小贝_mysql三种子查询

mysql三种子查询 简要: 一.三种子查询 二.三种子查询理解模型 一.mysql 三种子查询 where子查询.from子查询.exists子查询 二.理解模型: 2.1.一个好的模型,便于我们去理解.当我们编写一条sql语句时,可以通过以下几点去理解: a.where表达式,把表达式放在行中,看表达式是否为真 b.列: 理解成变量,可以运算 c. 取出结果,可以理解成一张临时表 2.2.理解三种子查询 1.where子查询 把内层查询的结果当做是外层查询的比较条件 详细:  select

MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析

随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间.次数.占比等

mysql性能优化-慢查询分析、优化索引和配置

一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)      key_buffer_size 5)      query_cache_size 6)      record_buffer_size 7)      read_rnd_buffer

MySQL慢日志查询全解析:从参数、配置到分析工具【转】

转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbaplus.cn/news-11-694-1.html 一.慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为

第四章 MySQL高级查询(二)

第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists也可以作为where语句的子查询,语法如下: SELECT --FROM 表名 WHERE  EXISTS(子查询): EXISTS关键字后面的参数是一个任意的子查询,如果该子查询没有返回行,则EXISTS子查询的结果为true,此时再执行外层查询语句.如果EXISTS子查询结果为false,此时外

mysql性能优化-慢查询分析、优化索引和配置【转】

一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)      key_buffer_size 5)      query_cache_size 6)      record_buffer_size 7)      read_rnd_buffer