MYSQL优化学习总结
mysql学习小结---索引的使用及优化
1. 索引那些事
1.1 复合索引
复合索引是指:包含一个或者多个列的索引。但复合索引的触发是有条件的。
假设我们现在有一个复合索引a,a中包含了三个列(id,name,sex)
对于a索引的使用会出现多种情况,当使用id或者id,name或者id,name,sex时复合索引会被触发。
但是,当时用到name或者sex或者name,sex时a复合索引是不会被触发的。因为索引会遵从索引的最左前缀原则。
也就是说,在使用复合索引的时候必须包含复合索引中的第一个列,且第一个列在首位复合索引才会被触发。
当然也存在特殊情况,当查询条件使用到了id,name的时候也可能只有id列起作用。
1.2 索引存在,但不使用索引的情况
如果mysql觉得使用索引比全表扫描更慢更慢则不会使用索引(例如:要查询某个字段中大于1小于100的值时)。
在使用OR做判断条件时,只有OR中所有的列都添加了索引,索引才会生效。如果OR条件添加了复合索引,但是列值不是复合索引的第一部分同样也不会使用(最左前缀原则)。
在建立索引后使用like进行检索信息的时候一定要注意%的放置位置。当%被放置在第一位时就会导致索引失效,反之索引生效。
注意where后比对条件的数据类型要一致,例如name为字符串类型,name=123会导致索引失效,name='123'则会生效。
下面将详细介绍索引的触发条件及各语句的优化。
2. 索引在各语句及关键字上的使用
2.1 优化insert语句
若在使用insert语句一次需要插入多行数据时,尽量在一条语句内完成,例如:insert into test values(1,2),(2,3),(3,4)
但是,需要注意sql语句的长度。可以在max_allowed_packe中修改,默认大小是1M。
2.2 优化group by语句
在使用group by分组的时候sql是会自动排序的这和order by排序类似,如果不想使用排序可以在group by后加order by null
例如:select * from test group by id order by null
添加order by null 后会减少分组查询时排序所需要的时间。
2.3 优化order by语句
如果order by前面有where子句,并且where后的列和order by的列合起来需要达到复合索引的最左前缀原则,且过滤性条件为常量(此处的常量是指=而不是<或者>这种范围性查询)的时候才会触发索引。
order by中ASC、DESC要一致才会使用索引。
order by的顺序和索引顺序相同(最左前缀原则)
2.4 子查询
在sql中尽量避免子查询的使用,子查询虽然写起来很简答,可以简化很多业务逻辑,但是子查询效率是很低的。
可以使用join连接的方式来替代子查询。因为join连接的查询方式mysql不需要在内存中创建临时表来完成子查询中逻辑上的需要两个步骤的查询工作。
所以join连接的查询方式是要比子查询的效率高的。
2.5 OR条件
OR条件前后的每个列都必须有索引才会使用到索引。
3. sql提示hint
hint语句是sql优化中很有用的一种优化方式,因为它是可以根据需求来控制索引的使用情况的。
hint语句将强制mysql生成一个临时的结果集,当临时结果集生成后会释放锁资源。
3.1 USE INDEX
hint中的USE INDEX语句是给mysql提供希望参考的索引,这样sql在执行的时候就不会考虑使用其它的索引。
例如:select * from test use index (索引名) where id = 2
3.2 IGNORE INDEX
hint中的IGNORE INDEX语句是让mysql值执行过程中忽略一个或者多个索引。
例如:select * from test ignore index (索引名) where id = 2
3.3 FORCE INDEX
hint中的FORCE INDEX语句是强制让mysql使用某个索引。
这个语句是指某些情况下即便使用索引,即便它的效率不是很高,但仍然会强制sql去使用这些索引。
如果刨除业务上的需要当我们在考虑是否为列创建或者修改索引时,我们可以使用show index from table1语句来看返回结果中的Cardinality列来决定后续的操作,该字段可以很直观的展示出表中该列值的不重复记录的数据量(这个值是预估的)。我们可以根据这个来判定列值选择性的高低,选择性越高代表着索引的效果越好。个人猜测这个和查找算法有关系,当有索引时我们采用的是二分法,无索引时采用的是顺序查找。再加上索引的后期维护及其它多方面的考虑对于选择性低的列我们还是不创建索引的好。
本文为茴香饺子博客的原创,欢迎转载,转载请注明出处
茴香饺子博客http://www.cnblogs.com/hxjz/
MYSQL优化学习总结的更多相关文章
- 燕十八MySQL优化学习笔记
观察 show status; 里面的这三个参数;Queries Threads_connected Threads_running判断周期性变化 -------------------------- ...
- mysql优化学习笔记
优化sql的一般步骤 通过show status了解各种sql的执行频率 定位执行效率低的sql语句 通过explain分析效率低的sql 通过show profile分析sql 通过trace分析优 ...
- 再次学习mysql优化
再次学习mysql优化 表的设计规范化(三范式) 添加索引(普通索引.主键索引.唯一索引.全文索引) 分表(水平分割.垂直分割) 读写分离(写add.update.delete) 存储过程 对mysq ...
- mysql性能优化学习笔记(1)优化目的、方向及数据库准备
前言: 最近参加面试,问到了很多关于mysql的优化方面的问题,回答的不是很好,也是因为原先做的项目流量不是很大,所以对mysql优化不是太了解,所以趁着周末,恶补一下. 本文来源于慕课网sqlerc ...
- SQL学习笔记之项目中常用的19条MySQL优化
在写文章之前,首先感谢 飞友科技 陆老师提供的文档.. 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 0x00 EXPLAIN 做MySQL优化,我们要善用 EXPL ...
- MYSQL学习笔记——数据库范式及MYSQL优化整体思路
一.数据库范式 为了建立冗余较小.结构合理的 ...
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- mysql优化记录
老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...
- 微博MySQL优化之路--dockone微信群分享
微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- Java 线程安全的集合
Vector ArrayList 的线程安全版本,对所有的修改方法都进行了 synchronized 同步处理.适用于多线程环境下对数据一致性要求高,且读写操作相对比较均衡,不需要很高并发性能的场景. ...
- FastAPI性能优化指南:参数解析与惰性加载
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意 第一章:参数解析性能原理 1.1 FastAPI请求处理管线 async def ...
- 『Plotly实战指南』--折线图绘制进阶篇
上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧. 1. 多折线图 ...
- Joker 智能开发平台再推重磅新品,引领开发新潮流
自 Joker 智能开发平台的前端可视化版本惊艳亮相后,便迅速在行业内掀起热潮,其创新的理念与出色的性能,为开发者和企业打造了高效.便捷的开发新路径,备受瞩目与好评.如今,Joker 智能开发平台即将 ...
- codelite常用快捷键积累
博客地址:https://www.cnblogs.com/zylyehuo/ 编译整个工作空间 workplace Ctrl+shift+B 编译当前文件 file Ctrl+F7 编译项目 proj ...
- 通过 JS 修改具体标签的属性的属性值
博客地址:https://www.cnblogs.com/zylyehuo/ window.addEventListener('DOMContentLoaded', function() { var ...
- docker pause 命令使用
暂停正在运行的镜像容器 用途是在启动的容器的过程又的容器启动快了 有的还没有就绪 调试过程使用 a3: 正在运行的镜像容器简称 暂停: docker pause a3 解除暂停: docker unp ...
- bug|SCSS相关问题
参考链接 [系统学习css]scss和sass以及 less的关系,node-sass.dart-sass和sass-loader是啥
- 适配器设计模式--java进阶day03
1.设计模式 通俗来讲,设计模式就是其他程序员遇到某些问题时的解决经验,我们学习设计模式,在遇到了同样的问题后便可解决 2.适配器设计模式 有人可能会感到疑惑,接口和实现类会有什么问题,我们举两个例子 ...
- 【Git】国内的项目托管网站-码云
国内的项目托管网站-码云 1 简介 使用 GitHub 作为项目托管网站如果网速不好很影响效率,大家也可以使用国内的项目托管网站-码云.网址是 https://gitee.com/ ,使用方式跟 Gi ...