索引常用注意事项

索引

    • 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,一经查实,立即删除!

相关文章

毫米波雷达_最新的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“彩虹的形成是因为光的色散…

前端学习(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…

闪电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…

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…

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…

前端学习(1351)模板引擎

const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, index.art); const html template(views, {name: 张三,age: 20 }); console.log(html); index.art <!DOCTYPE html> <html la…

前端学习(1352)模板语法

demo27.js const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, 01.art); const html template(views, {name: 张三,age: 20,content: <h1>我是歌谣</h1> }); console.log(html)…

前端学习(1353)模板语法条件判断

const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, 02.art); const html template(views, {name: 张三,age: 20,/* content: <h1>我是歌谣</h1> */ }); console.log(html); 0…

MySql 缓存查询原理与缓存监控 和 索引监控

MySql缓存查询原理与缓存监控 And 索引监控 by:授客 QQ&#xff1a;1033553122 查询缓存 1.查询缓存操作原理 mysql执行查询语句之前&#xff0c;把查询语句同查询缓存中的语句进行比较&#xff0c;且是按字节比较&#xff0c;仅完全一致才被认为相同。如下&#xff0c;这两…

前端学习(1354):集合关联

const mongoose require(mongoose); mongoose.connect(mongodb://localhost/playground, { useUnifiedTopology: true }).then(() > console.log(数据库连接成功)).catch(err > console.log(err, 数据库连接失败)) const userSchema new mongoose.Schema({name: {type:…

ati jti jwt 和_一文搞懂JWT

Django REST framework JWT一、JWT简介二、JWT 组成headersignature三.使用手动生成jwt前端保存jwt一、JWT简介JWT(Json Web Token) 是一个开放标准(RFC 7519)&#xff0c;它定义了一种用于简洁&#xff0c;自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT…

前端学习(1355)模板语法循环

const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, 03.art); const html template(views, {users: [{name: geyao,age: 20,sex: 男}, {name: xiao,age: 20,sex: 男}, {name: hau,age: 20,se…