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 ...
随机推荐
- go学习笔记-反射(Reflection)
反射(Reflection) 反射是利用reflect包实现的 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 ...
- Java——多线程---18.11.22
多线程代码:Runnable方法 package com.hebust.java.third; import java.util.Random; public class SaleTicket imp ...
- PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证
权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,= ...
- CF 741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths http://codeforces.com/problemset/probl ...
- Mac OS下Android Studio:/dev/kvm not found
在配置模拟器时出现该报错,在网上找了很多教程都没能解决,当然可能是这些教程并不适用于我.总的来说,还是要“对症下药”! 解决方法如下: 点击“系统偏好设置”-“安全性与隐私”,然后会在“通用”这个界面 ...
- SQLite FTS3/FTS4与一些使用心得
此文已由作者王攀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 简介 对于今天的移动.桌面客户端应用而言,离线全文检索的需求已经十分强烈,我们日常使用的邮件客户端.云音乐.云 ...
- spring使用set方法注入的常见类型写法
首先配置spring的pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- Linux命令应用大词典-第41章 MySQL数据库
41.1 mysqld_safe:MySQL服务器启动脚本 41.2 mysql_install_db:初始化MySQL数据目录 41.3 mysqlshow:显示MySQL数据库结构 41.4 my ...
- 初学Direct X (2)
初学Direct X (2) 这一次要学习如何现实位图,尽管看过对双缓冲机制还有很多疑问,但是这并不阻碍我对他的入门了解 Direct3D提供了一个双重/后台缓冲区,在调用CreateDevice之时 ...
- Siki_Unity_2-1_API常用方法和类详细讲解(上)
Unity 2-1 API常用方法和类详细讲解(上) 任务1&2:课程前言.学习方法 && 开发环境.查API文档 API: Application Programming I ...