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。
mysql(三) 慢查询分析(二)的更多相关文章
- MySQL的慢查询分析
慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ...
- MySQL的索引优化分析(二)
一.索引优化 1,单表索引优化 建表 CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO ...
- MySQL慢日志查询分析方法与工具
MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...
- 【mysql】截取查询分析
1. 慢查询日志 1.1 是什么 (1)MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL ...
- mysql的in查询分析
群里山楂大仙和电台大神探讨到mysql的in查询的问题,问题如下: student表有class_id的索引,但是只查询一个的时候用索引,查两个就不用索引了 这是很奇怪的现象,我试了一下也是这样,真是 ...
- 一次MySQL线上慢查询分析及索引使用
本文由作者郑智辉授权网易云社区发布. 0.前言 本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化.在两次处理问题过程中,进行的思考. 1. ...
- 关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
大家可以自行网上找资源(网上资源比较多,不建议下载我的),也可以在我这里下载: 1.取得每个部门最高薪水的人员名称:正确 一共有4个单位,要进行左外连接 其中一个单位没得员工 SELECT dep ...
- 小贝_mysql三种子查询
mysql三种子查询 简要: 一.三种子查询 二.三种子查询理解模型 一.mysql 三种子查询 where子查询.from子查询.exists子查询 二.理解模型: 2.1.一个好的模型,便于我们去 ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
随机推荐
- JavaScript’s “this”: how it works, where it can trip you up
JavaScript’s “this”: how it works, where it can trip you up http://speakingjs.com/es5/ch23.html#_ind ...
- day 4 __all__ 包 __init__.py
1.__all__的作用 如果一个文件中有__all__变量,那么也就意味着这个变量中的元素,不会被from xxx import *时导入 __all__ = ["test1", ...
- springboot 常用依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- 【公司动态添加行】前台穿一个json的字符串到后台,并解析
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
- hadoop 家族图
hadoop家族
- Linux命令应用大词典-第32章 性能监控
32.1 sar:收集.报告或保存系统活动信息 32.2 iostat:报告CPU统计数据和设备.分区输入.输出消息 32.3 iotop:进行I/O监控 32.4 mpstat:报告CPU相关的统计 ...
- 使用jenkins构建一个maven项目
1.登陆到jenkins首页,创建项目-->选择maven-->输入项目名称-->选择项目类型 2.进入项目配置:{先写一下项目描述和设置下保留的历史构建,然后向下拉} 找到源吗管理 ...
- Python递归算法入门
递归是一种算法,它在编程里面有着广泛的应用: 1. 递归必须满足哪两个基本条件? 一.函数调用自身 二.设置了正确的返回条件 2. 思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况? 答: ...
- Unity Shader学习笔记 - 用UV动画实现沙滩上的泡沫
这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成: // Upgrade NOTE: r ...
- 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
第2章--进阶篇 类型进阶 类型: Undefined Null Boolean String Number Object 原始类型(值类型):undefined, null, true, " ...