索引常用注意事项

索引

    • 1. 索引怎么建好?
    • 2. 索引容易失效的场景
    • 3. 连接查询索引优化
    • 4. order by,group by
    • 5. 覆盖索引
    • 6. 索引下推

1. 索引怎么建好?

  • 单表
    • 主键必须唯一,且单调递增
    • 有唯一键的,尽量建立唯一键
    • where条件用得比较多的字段
    • 查询条件多的,用联合索引,如果带有范围条件的,将这个列,放在联合索引的后面
  • 多表查询时候的索引

    • on条件后面列建立索引,select a.a1, a.a2, b.b1, b.b2 from a join b on a.a1 = b.b1; 这种sql两个列的类型要相同。
    • 多用join代in查询
  • 其它

    • order by, group by的列
    • UPDATE、DELETE 的 WHERE 条件列

2. 索引容易失效的场景

①. 全值匹配, 联合索引下,每个列都用上索引

②. 最左匹配原则

create index idx_name_age_classId on student(name, age, classId);-- 不生效
explain select * from student where age = 1;

查询上面的语句不会走索引, 如果是name作为条件,索引才会生效

下面走了索引,name & age

explain select id, name, age, classId from student where name = 'jack' and age = 1;


③. 排序字段应该放最后

# age 作为排序字段,放到后面
create index idx_cid_name_age on student(classId, name, age);explain select * from student where age > 48 and classId = 99 and name = 'jack';

④ 不等于, (<>, !=) 索引失效

⑤ is null 有效, is not null 索引失效

⑥ like查询以通配符开始的失效,如果不走索引覆盖的话。用es。

⑦ 函数导致索引失效

⑧ or 前后存在非索引的列, 索引失效

⑨ 数据库和表的字符集统一使用utf8mb4

3. 连接查询索引优化

① 左连接 左边的表是驱动表 右边的表是被驱动表.
② 内连接, 小表驱动大表, 小表是结果集少的
③ 为join的字段创建索引,并且join的字段类型要一致

保证被驱动表的JOIN字段已经创建了索引
需要JOIN 的字段,数据类型保持绝对一致。
LEFT JOIN 时,选择小表作为驱动表, 大表作为被驱动表 。减少外层循环的次数。
INNER JOIN 时,MySQL会自动将 小结果集的表选为驱动表 。选择相信MySQL优化策略。
能够直接多表关联的尽量直接关联,不用子查询。(减少查询的趟数)
不建议使用子查询,建议将子查询SQL拆开结合程序多次查询,或使用 JOIN 来代替子查询。
衍生表建不了索引。

4. order by,group by

  • 排序, 单个字段, 请建立索引。多个字段建立联合索引。 尽可能的使用index索引排序, 如果不能, 使用file sort 文件排序,加大内存参数

    order by 有两种排序方法:1,走索引;2,file sort 内存排序。索引快,如果用内存排序,吃资源。

  1. SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中 避免全表扫描 ,在 ORDER BY 子句 避免使用 FileSort 排序 。当然,某些情况下全表扫描,或者 FileSort 排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。
  2. 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列;如果不同就使用联合索引
  3. 无法使用 Index 时,需要对 FileSort 方式进行调优。
  • group by 也请走索引…

group by 使用索引的原则几乎跟order by一致 ,group by 即使没有过滤条件用到索引,也可以直接使用索引。
group by 先排序再分组,遵照索引建的最佳左前缀法则
当无法使用索引列,增大 max_length_for_sort_data 和 sort_buffer_size 参数的设置
where效率高于having,能写在where限定的条件就不要写在having中了
减少使用order by,和业务沟通能不排序就不排序,或将排序放到程序端去做。Order by、group by、distinct这些语句较为耗费CPU,数据库的CPU资源是极其宝贵的。
包含了order by、group by、distinct这些查询的语句,where条件过滤出来的结果集请保持在1000行以内,否则SQL会很慢。

5. 覆盖索引

对联合索引来说的,查询直接查索引。不会回表,一次查询出来结果。查询的列都是索引,查询条件也是所有列。

所以这里的like统配匹配不会失效。

6. 索引下推

这个也是联合索引中出现的,最大的特征是,用explain分析工具,查询extra信息,显示Using index condition
① 索引的每个列和查询的值比较一遍
② 匹配到的索引,再进行回表拿到结果。

ICP的使用条件:
① 只能用于二级索引(secondary index)
②explain显示的执行计划中type值(join 类型)为 range 、 ref 、 eq_ref 或者 ref_or_null 。
③ 并非全部where条件都可以用ICP筛选,如果where条件的字段不在索引列中,还是要读取整表的记录
到server端做where过滤。
④ ICP可以用于MyISAM和InnnoDB存储引擎
⑤ MySQL 5.6版本的不支持分区表的ICP功能,5.7版本的开始支持。
⑥ 当SQL使用覆盖索引时,不支持ICP优化方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EntityFramework的安装

关于EntityFramework在vs2012无法引用的问题 这段时间学习MVC&#xff0c;发现一个问题&#xff0c;我公司的电脑可以直接引用EntityFrameWork这个命名空间&#xff0c;但我家里面的电脑就不能直接引用&#xff0c;刚开始以为是我电脑配置问题&#xff0c;后重装电脑&#xff0…

毫米波雷达_最新的7个毫米波雷达应用案例

毫米波雷达传感器如何做到"全天候"&#xff1f;毫米波雷达使用的技术是毫米波(millimeterwave)&#xff0c;通常缩写为MMW&#xff0c;波长为1&#xff5e;10毫米&#xff0c;频率为30~300GHz的电磁波。根据波的传播理论&#xff0c;频率越高&#xff0c;波长越短&am…

前端学习(1345):用户的增删改查操作2

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); //数据库连接地址 mongoose.connect(mongodb://localhost/playground, { useUnifiedTop…

太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...

-1感谢某不愿透露姓名的高中同学提供支持。0请先解释一下你的这个问题提法可能的歧义&#xff1a;究竟是“是因为”后面的词语组成一个整体&#xff0c;还是“和”前面的词语组成一个整体呢&#xff1f;不讲清楚的话&#xff0c;答案会有一些差距。1“彩虹的形成是因为光的色散…

力扣刷题【20,21,26,27,35】

-20 有效的括号21 合并两个有序链表26 删除数组中的重复项27. 移除元素35. 搜索插入位置20 有效的括号 使用replace一直替换 package top.lel.lc.easy.valid_parentheses;import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.…

前端学习(1346):用户的增删改查操作3增加

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

【leetcode】Intersection of Two Linked Lists

Intersection of Two Linked Lists Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists: A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3begin to int…

闪电shader_【Shader案例】怎样做出自然的闪电

(本次案例的效果)最近下载了一套特效&#xff0c;其中一个关于闪电制作的shader想法特别聪明&#xff0c;这里特地附上原代码&#xff0c;并教你怎么把源代码转换成连连看&#xff0c;下面开始正文。这是原本shader定义的属性&#xff1a;_TintColor(闪电的颜色)_MainTex(一张R…

MySQL8数据恢复

binlog数据恢复恢复流程恢复流程 先登录MySQL flush log flush log这样会在MySQL binglog日志目录重新生成二进制文件 查看日志文件名 binlog.000033是我刚生成的日志&#xff0c;现在操作的是binlog.000032这个文件。相当于备份了下。 基于位置恢复&#xff08;先查看位置…

前端学习(1347):用户的增删改查操作4修改

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

前端学习(1348):用户的增删改查操作5修改

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

ogg oracle 测试kafka_基于OGG的Oracle与Hadoop集群/kafka准实时同步

Oracle里存储的结构化数据导出到Hadoop体系做离线计算是一种常见数据处置手段。近期有场景需要做Oracle到Hadoop体系的实时导入&#xff0c;这里以此案例做以介绍。Oracle作为商业化的数据库解决方案&#xff0c;自发性的获取数据库事务日志等比较困难&#xff0c;故选择官方提…

50个jQuery代码段帮你成为更出色的JS开发者

http://www.jqdemo.com/525.html转载于:https://www.cnblogs.com/iqiao/p/4255515.html

parallelStream与stream

并行流&#x1f36d; 多线程并发&#x1f36d; 多线程并发 &#x1f355;stream与parallelStream 下面的代码分别用了parallelStream与stream进行迭代。获取对应的每一项值&#xff0c;和对应的线程名称。 package top.lel.jvm.sdk.stream;import java.util.List; import jav…

前端学习(1349):用户的增删改查操作6删除

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

力扣刷题【94,100,101,104】

binary tree&#x1f384;树的数据结构 // Definition for a binary tree node. public static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val val;th…

Java, C#, Swift语法对比速查表

Java 8C# 6Swift变量类型 变量名;类型 变量名;var 变量名 : 类型;变量&#xff08;类型推断&#xff09;N/Avar 变量名初值;var 变量名初值;常量final 类型 常量名初值;readonly 类型 常量名初值;let 常量名 : 类型初值;基本类型 int short long byte double float boolean cha…

0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程

中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程。所谓bond&#xff0c;就是把多个物理网卡绑定成一个逻辑网卡&#xff0c;使用同一个IP工作&#xff0c;在增加带宽的同时也可以提高冗余性&#xff0c;一般使用较多的就是来提高冗余&#xff0c;分别和不同交换机相连…

前端学习(1350):用户的增删改查操作7增删改查

demo25.js //创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 /* const mongoose require(mongoose); */ //获取连接 const url require(url); // const querystring require(querystring);require(./demo26.js);…

基于aop的日志记录

aop实现日志记录记录工具切面logback配置测试记录工具 目标&#xff1a; 统计rest接口请求参数&#xff0c;请求地址&#xff0c;请求IP&#xff0c;响应数据&#xff0c;响应时间。方便后续问题排查&#xff0c;以及性能的总体分析。 基于springboot会使用面向切面编程基于l…