索引的选择

①首先,清除emp上面的所有索引,只保留主键索引!

drop index idx_age_deptid_name on emp;

②查询:年龄为30岁的,且员工编号小于101000的用户,按用户名称排序

explain SELECT SQL_NO_CACHE * FROM emp WHERE age =30 AND empno <101000 ORDER BY NAME ;

③全表扫描肯定是不被允许的,因此我们要考虑优化。

思路:首先需要让where的过滤条件,用上索引;

查询中,age.empno是查询的过滤条件,而name则是排序的字段,因此我们来创建一个此三个字段的复合索引:

create index idx_age_empno_name on emp(age,empno,name);

再次查询,发现using filesort依然存在。

原因: empno是范围查询,因此导致了索引失效,所以name字段无法使用索引排序。

所以,三个字段的符合索引,没有意义,因为empno和name字段只能选择其一!

④解决: 鱼与熊掌不可兼得,因此,要么选择empno,要么选择name

drop index idx_age_empno_name on emp;

create index idx_age_name on emp(age,name);

create index idx_age_empno on emp(age,empno);

两个索引同时存在,mysql会选择哪个?

explain SELECT SQL_NO_CACHE *  FROM emp use index(idx_age_name) WHERE age =30 AND empno <101000 ORDER BY NAME ;

原因:所有的排序都是在条件过滤之后才执行的,所以如果条件过滤了大部分数据的话,几百几千条数据进行排序其实并不是很消耗性能,即使索引优化了排序但实际提升性能很有限。  相对的 empno<101000 这个条件如果没有用到索引的话,要对几万条的数据进行扫描,这是非常消耗性能的,使用empno字段的范围查询,过滤性更好(empno从100000开始)!

结论: 当范围条件和group by 或者 order by  的字段出现二选一时 ,优先观察条件字段的过滤数量,如果过滤的数据足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。

上一篇: 前端培训面试题分析-在什么情况下会触发重排和重绘

下一篇: Java培训学习MySQL之排序分组优化using filesort

java 索引排序_Java培训MySQL之排序分组优化索引的选择相关推荐

  1. java对象排序_Java™ 教程(对象排序)

    对象排序 List l可以如下排序. Collections.sort(l); 如果List包含String元素,它将按字母顺序排序,如果它由Date元素组成,它将按时间顺序排序,这是怎么发生的?St ...

  2. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  3. java util 排序_Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...

  4. java comparable排序_java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 packa ...

  5. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  6. mysql java中文乱码_java连接mysql添加中文乱码_MySQL

    bitsCN.com java添加中文数据到mysql中, 包含中文就乱码 最初是想应该是由于字符编码不一致,所以查看数据库的属性跟表的属性 查看表的字符集也是utf8,不是的改成自己想要设置的,我这 ...

  7. MySQL高级 - 案例 - 系统性能优化 - 索引优化

    性能优化 - 索引 当根据操作人进行查询时, 查询的效率很低,耗时比较长.原因就是因为在创建数据库表结构时,并没有针对于 操作人 字段建立索引. CREATE INDEX idx_user_metho ...

  8. java线程排序_Java中的并发排序

    我目前正在开发一个程序来同时对字符串进行排序.我的程序接收一个文件,将文件的每一行读入一个数组,并将字符串数组拆分成较小的字符串数组.然后,程序为每个较小的数组启动一个线程,并对它们进行快速排序.每个 ...

  9. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

最新文章

  1. 《大数据、小数据、无数据:网络世界的数据学术》一 3.3 社会与技术
  2. C#学习基本概念之关键字---delegate(委托)
  3. flowable设计器节点属性扩展_Flowable-流程定义扩展属性
  4. Unix网络协议分析
  5. 二次修改:【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类
  6. JVM—加载到方法区的Class文件长什么样?
  7. Tomcat 的运行机制
  8. MVC5网站部署到IIS7
  9. 微分方程的数值解法与程序实现 pdf_初中数学知识点|一元一次方程的概念及讲解(二)建议收藏!内含pdf版...
  10. jqprint获取打印页数_高年级应用题40道,假期快给孩子打印练习吧!(含答案)...
  11. ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
  12. 重新拾起VS2008加入战斗
  13. 会议通知|2019暑期全国高校Python数据分析与实训课程高级研修班
  14. 网站网络流量的极限,你考虑过么?
  15. [转]Visual Studio 各版本区别
  16. 数学建模常用模型和算法介绍
  17. 65nm工艺下MOM电容详解与蒙特卡洛仿真及calibre xRC
  18. windows 密码过期_为什么我的密码在Windows中过期?
  19. android环信3.0v回撤,环信Android消息回撤
  20. 做外贸必备的十大网站

热门文章

  1. 美国本科计算机科学,美国本科计算机科学就业情况分析
  2. Input子系统(二)【转】
  3. 折叠屏来了,开发者们准备好了吗?
  4. 0110-如何给Kerberos环境下的CDH集群添加Gateway节点
  5. ASP.NET SignalR增加Azure支持
  6. Struts2的配置文件——web.xml
  7. Dart的HTTP请求和响应(1)
  8. 转:Ogre的MaterialSystem分析
  9. flume 集群datanode节点失败导致hdfs写失败(转)
  10. android listview item点击时更改textview的颜色 代码中实现