mysql索引优化 - 排序分组优化

news/2023/12/10 15:05:54

where 条件和 on 的判断这些过滤条件,作为优先优化的部分,是要被先考虑的!
其次,如果有分组和排序,那么 也要考虑 grouo by 和 order by。


1. 必须有过滤,才会用到索引
结论:where,limt 都相当于一种过滤条件,所以才能使用上索引

2. 顺序不要错,否则会产生 Using filesort(需要优化) 
explain select * from emp where age=45 order by deptid,name;

explain select * from emp where age=45 order by deptid,empno;
empno 字段并没有建立索引,因此也无法用到索引,此字段需要排序!

explain select * from emp where age=45 order by name,deptid;
where 两侧列的顺序可以变换,效果相同,但是 order by 列的顺序不能随便变换!

explain select * from emp where deptid=45 order by age;
deptid 作为过滤条件的字段,无法使用索引,因此排序没法用上索引

 3. order by方向不一致,必会产生 Using filesort(需要优化) 
explain select * from emp where age=45 order by deptid desc, name desc ; (推荐)
如果可以用上索引的字段都使用正序或者逆序,实际上是没有任何影响的,无非将结果集调换顺序。

explain select * from emp where age=45 order by deptid asc, name desc ;
如果排序的字段,顺序有差异,就需要将差异的部分,进行一次倒置顺序,因此还是需要手动排序的!

4. 索引的选择 idx_age_name 和 idx_age_empno
为什么不建3个字段的索引

create index idx_age_empno_name on emp(age,empno,name);
原因: empno 是范围查询,因此导致了索引失效,所以 name 字段无法使用索引排序。

create index idx_age_name on emp(age,name); 
create index idx_age_empno on emp(age,empno); [这里这个索引更好]

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

结论: 当范围条件和 group by 或者 order by 的字段出现二选一时 ,优先观察条件字段的过滤数量,如果过滤的 数据足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。 
原因:所有的排序都是在条件过滤之后才执行的,所以如果条件过滤了大部分数据的话,几百几千条数据进行排序 其实并不是很消耗性能,即使索引优化了排序但实际提升性能很有限。 相对的 empno<101000 这个条件如果没 有用到索引的话,要对几万条的数据进行扫描,这是非常消耗性能的,使用 empno 字段的范围查询,过滤性更好 (empno 从 100000 开始)!

5. 使用覆盖索引 
覆盖索引:SQL 只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。


6. group by 可以直接使用索引
group by 使用索引的原则几乎跟 order by 一致
唯一区别groupby 即使没有过滤条件用到索引,也可以直 接使用索引


https://dhexx.cn/news/show-17235.html

相关文章

UIView详解

来源&#xff1a;http://blog.csdn.net/chengyingzhilian/article/details/7894276 UIView表示屏幕上的一块矩形区域&#xff0c;它在App中占有绝对重要的地位&#xff0c;因为IOS中几乎所有可视化控件都是UIView的子类。负责渲染区域的内容&#xff0c;并且响应该区域内发生的…

jmeter基础入门(HTTP,TCP,SQL查询,新增,查看报告)

示例下载地址 https://download.csdn.net/download/qq_41712271/20398149有坑的地方 1 发送TCP请求&#xff0c;注意Tcp client classname,如下图&#xff0c;这里发送16进制&#xff0c;所以写 BinaryTCPClientImpl TCPClientImpl&#xff1a;纯文本为内容进行发送 BinaryT…

这么方便吗?用ChatGPT生成Excel(详解步骤)

文章目录前言使用过 ChatGPT 的人都知道&#xff0c;提示占据非常重要的位置。而 Word&#xff0c;Excel、PPT 这办公三大件中&#xff0c;当属 Excel 最难搞&#xff0c;想要熟练掌握它&#xff0c;需要记住很多公式。但是使用提示就简单多了&#xff0c;和 ChatGPT 聊聊天就能…

jenkins持续集成入门1

jenkins持续集成相关的软件安装分布架构图 软件安装的列表如下&#xff1a; jdk8或以上 maven git GitLab-EE Docker Harbor &#xff08;docker私服&#xff09; jenkins SonarQube &#xff08;代码审查&#xff09; Tomcat

HTML5新增Canvas标签及对应属性、API详解(基础一)

知识说明&#xff1a; HTML5新增的canvas标签&#xff0c;通过创建画布&#xff0c;在画布上创建任何想要的形状&#xff0c;下面将canvas的API以及属性做一个整理&#xff0c;并且附上时钟的示例&#xff0c;便于后期复习学习&#xff01;Fighting&#xff01; 一、标签原型 &…

gitlab 使用中碰到的常见问题整理

1 gitlab的默认域名为http://gitlab.example.com&#xff0c;如何修改https://blog.51cto.com/u_3265857/2347596 2 windows下向gitlab提交代码&#xff0c;如果添加ssh认证https://www.cnblogs.com/573734817pc/p/13711146.html 3 gitlab push时报错error:failed to push som…

HDU 4793 2013 Changsha Regional Collision[简单的平面几何]

圆形奖章给定半径的半径和圆形区域。另一个硬币的半径&#xff0c;然后在桌面上平稳。给定硬币的速&#xff08;的大小和方向&#xff0c;vx&#xff0c;vy&#xff09;和坐标&#xff08;奖牌同心圆形区域&#xff0c;圆和心脏为源&#xff09;&#xff0c;Q币在一个圆形区域和…

iOS手势识别的详细介绍

1、UIGestureRecognizer介绍 手势识别在iOS上非常重要&#xff0c;手势操作移动设备的重要特征&#xff0c;极大的增加了移动设备使用便捷性。iOS系统在3.2以后&#xff0c;为方便开发这使用一些常用的手势&#xff0c;提供了UIGestureRecognizer类。手势识别UIGestureRecogniz…

jenkins持续集成入门2 - 从gitlab中拉取代码(http的git地址),凭证类型用 Username with password的方式

1 jenkins下载插件 Credentials Binding&#xff0c;就是凭证管理的插件 2 添加一个用户名&#xff0c;密码方式的凭证&#xff0c;也可以在添加项目的时候&#xff0c;顺带创建&#xff0c;这里写的是gitlab的用户和密码 3 创建项目&#xff0c;类型为自由风格的&#xff0c;核…

Enterprise Solution 2.3

1. 登陆窗体和主界面增加语言选项&#xff0c;同时可记住用户登陆的语言和数据库。 2. 主界面的树功能可记住上次打开的模块菜单。 3. 修复主界面菜单生成问题和导航图区上下文菜单生成问题。 4. 增加自动更新功能。可以将最新的程序包部署到HTTP服务器上&#xff0c;主界面的C…