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 ...
随机推荐
- 程序员必看 Linux 常用命令(重要)
文件操作命令 find find 用于在指定目录下查找文件或子目录,如果不指定查找目录,则在当前目录下查找 命令格式:find path -option [-print] [ -exec/-ok co ...
- pip和pip3如何更新
pip pip install --upgrade pip pip3 pip3 install --upgrade pip
- 解决ERROR 1231 (42000): Variable 'time_zone' can't
MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败.(比方说导入数据库,数据表) mysql 数据 ...
- Dockerfile 语法与常用命令
转发请注明出处: 一.Dockerfile 核心语法规则 指令大写:所有指令必须大写(如 FROM, RUN) 顺序执行:指令按顺序从上到下执行 分层构建:每条指令生成一个镜像层,修改上层不会影响下层 ...
- Proxmox ve(Pve) 安装windows server
1.安装proxmox ve点击直达 官网地址 下载下来如果下载速度太慢 可以去安装个IDM https://www.52pojie.cn/thread-1013874-1-1.html 然后需要制作 ...
- MaxKB+Ollama 离线部署
主题:在 Centos7 环境部署 MaxKB 以及 Ollama 实现基于离线大模型的的小助手调用. 选择离线部署的原因:原计划是打算直接使用 1Panel 进行 MaxKB 和 Ollama 一键 ...
- BigDecimal类--java进阶day05
1.BigDecimal出现的原因 2.BigDecimal的创建 不推荐第一种形式,会有误差 第二种方式创建对象 第三种方式调用方法 2.BigDecimal常用方法 除法的特殊事项 如果有除不尽的 ...
- python爬虫爬取B站视频字幕,词频统计,使用pyecharts画词云(wordcloud)
我们使用beatifulsop爬取到B站视频的字幕:https://www.cnblogs.com/becks/p/14540355.html 然后将爬取的字幕,使用pandas处理后写到CSV文件中 ...
- eolinker响应预处理:传参解决方法(截取返回数据中的某一段数据,正则截取)
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景描述: 登录用例A,参加活动用例B,用户参加活动需要 ...
- 说说 Java 的执行流程?
Java 的执行流程 Java 的执行流程包括多个阶段,从源码编写到最终程序的执行,涉及到编译.类加载.字节码执行.垃圾回收等多个环节.下面将详细介绍 Java 程序的执行流程. 1. 编写源代码 开 ...