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安装python centos
下载安装包 可以到官网 ftp 地址,复制指定 python 版本源码安装包下载链接 https://www.python.org/ftp/python/ 或者到官网 downloads, 复制指定 ...
- 唐僧,一名合格的IT项目经理
唐僧, 家喻户晓的唐三藏是也, 他是参悟佛法的大唐高僧,他还是大话西游的男一号, 可是有谁知道,他曾经是一名杰出的项目经理.他所领导的项目是是当时最庞大的IT项目--西天之行求取真经;他所领导的项目团 ...
- Delphi编写的一款锁屏小工具
Delphi编写的一款锁屏小工具,双击程序立即锁屏,木有界面的.解除锁屏密码:alt+空格. unit Unit1; interface uses Windows, Messages, SysUtil ...
- Redis 原理 - String
String 数据结构 首先我来看下, Redis 中 String 的数据结构: 我们称之为 SDS (Simple Dynamic String) 简单动态字符串 struct sdshdr { ...
- CSS那些事读书笔记-2
背景 作为一个后端开发,曾经尝试过学习前端,但是总觉不得要领,照猫画虎,而公司里又有专业的前端开发,工作中几乎接触不到实际的前端任务,所以前端的技能田野一直是一片荒芜.但是笔者深知前端的技能对找工作和 ...
- luogu-P5320题解
简要题意 设 \(f(n)\) 表示用多米诺骨牌恰好铺满 \(2\times n\) 的平面的方案数,\(g(n)\) 表示用多米诺骨牌恰好铺满 \(3\times n\) 的平面的方案数:设 \(F ...
- ASP.NET Core 项目归档
把一些基于 ASP.NET Core 的实用项目找个地方记录下... 项目列表: IdentityServer
- leetcode每日一题:转换二维数组
题目 2610. 转换二维数组 给你一个整数数组 nums .请你创建一个满足以下条件的二维数组: 二维数组应该 只 包含数组 nums 中的元素. 二维数组中的每一行都包含 不同 的整数. 二维数组 ...
- 再说【把postgreSQL的表导入SQLite 】
为这个问题,百度了一大圈.确实答案就在手边. 这个短语认识一下:[Extract-Transfrom-Load]其意义: ETL,是英文 Extract-Transform-Load 的缩写, ...
- 张高兴的大模型开发实战:(四)使用 LangGraph 实现多智能体应用
目录 环境搭建与配置 定义智能体 加载模型 提取关键词 生成回答 连接智能体 定义图的状态 定义节点方法 根据指令路由 生成回答 文件处理 提取关键词 网络搜索 定义图的结构 运行图 运行指南 在控制 ...