(一)MySQL优化之索引优化

一、索引的概念

我们知道,在查询过程中,如果被查询的表没有索引,数据库会进行全表扫描,而如果添加了相应的索引,数据库会根据索引直接查找符合条件的数据。因此,索引的存在会大大提高查询效率。而索引其实就是一个特殊文件(InnoDB中索引是表空间的一部分),它包含碰上对表中所有记录的引用指针。

二、索引的分类

索引可以分为两种:聚簇索引和非聚簇索引。

(一)聚簇索引

聚簇索引是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。

(二)非聚簇索引

非聚簇索引使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。查询先通过索引查找到符合条件的地址,然后通过地址查再找数据。

(三)两种索引的区别

1.聚簇索引是和数据在一起的,通过索引即可一次性查询出数据。
2.非聚簇索引索引文件和数据是独立的,查询会先查找到符合条件的索引,通过地址进行二次查找表中的数据。
3.聚簇索引的效率比非聚簇索引的高。
4.由于节子节点(数据页)只能按照一颗B+树排序,故一张表只能有一个聚簇索引。辅助索引的存在不影响聚簇索引中数据的组织,所以一张表可以有多个辅助索引。

(四) 应用

1.InnoDB存储引擎

1.1 主键索引

InnoDB存储引擎主键索引使用的是聚簇索引,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
优点:
    1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
    2.聚簇索引对于主键的排序查找和范围查找速度非常快
缺点:
    1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
    2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。

1.2 辅助索引(又叫非聚簇索引)

InnoDB的所有辅助索引都引用主键作为data域。
InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引(Secondary Index, 也就是非主键索引)也会包含主键列,所以,如果主键定义的比较大,辅助索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引。
  文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
  不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白:
   1、为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,
   2、用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

2.MyISAM存储引擎

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复
由此可知,MyISAM存储引擎的索引都是非聚簇索引。但是由于其主键索引和辅助索引存储的都是键的地址,两者是独立的索引树,因此与InnoDB不同的是,辅助索引不用依赖和访问主索引的索引树。

参考博客:https://www.cnblogs.com/jiawen010/p/11805241.html

三、索引的优缺点

(一)优点

1.唯一索引可以保证数据唯一性。
2.添加索引可以大大提高查询效率。
3.加速表与表之间的连接。
4.通过使用索引,可以在查询过程中,使用优化隐藏器提高系统性能。

(二)缺点

1.创建和维护索引要消耗时间,而且这种时间会随着数据量的增加而增加。
2.索引会占用物理空间,聚簇索引占用的空间会更大。在InnoDB中,由于辅助索引B+树的叶子上会存储主键数据,因此主键长度也要尽量定义小一些。
3.由于增、删、改操作的时候,索引也要动态维护,这样也就降低了数据维护的速度。

四、创建索引的注意事项

一般来说,以下字段适合创建索引:

1.经常查询的字段:可以提高查询速度。
2.主键字段:强调主键的唯一性,有助于组织表数据的排列结构。
3.经常使用的连接键:加快连接速度。
4.经常需要进行范围查询的列:因为索引是有序的,其指定的范围也是连续的。
5.经常使用的排序字段:因为索引是有序的,可以利用索引的排序加快查询速度。
6.常用的where语句过滤条件。

一般来说,以下字段不太适合创建索引:

1.查询中很少使用的列:额外的索引会增大磁盘的需求,也会额外增加维护成本。
2.有大量重复数据的字段:对查询并没有明显的效果。
3.对于text,image,bit数据类型字段:这些列的数据量太大,可是我们查询中一般只截取使用其中的一小段数据。
4.对于修改远远大于检索需求的列,不应该建立索引。即使创建索引会增加查询效率,但是大大降低修改的性能,增加维护成本。

五、Mysql索引的类型和创建

这里不在过多赘述,请自行百度。
要说明的两点是
1.组合索引根据最左前缀的规则,查询会从最左边的索引字段开始组合。如果查询中没有使用索引中最左侧的字段,将不会使用该组合索引。

六、Mysql索引优化

优化不是一成不变的,版本不同,优化也有可能会不一样。以下仅供参考:

1.范围字段多使用聚簇索引:
因为聚簇索引只需要查找到所需数据的开头和结尾即可,而非聚簇索引要查到每一项数据对应的页码,再根据页码查找具体数据。
2.少数不同值的列推荐使用聚类索引;
3.频繁修改更新的列推荐使用非聚集索引;
4.where条件中,字段类型不匹配也不会使用索引;

比如SKU为8位数字组成的字符串,如果用 SKU='12345678’会使用索引,但是使用 SKU = 12345678 则不会使用索引。

5.LIKE模糊查询
索引根据最左前缀原则,右侧模糊查询可以使用索引,左模糊不行。例如:假设字段CLOUMN_1有索引,那么
CLOUMN_1 LIKE 'ABCD%' 可以使用索引;
CLOUMN_1 LIKE '%ABCD' 以及 CLOUMN_1 LIKE '%ABCD%' 不能使用索引。
6.使用短索引
如果列的值都比较长,如果前10或20个字符多数值是唯一的,就不需要对整个列的数据进行索引。短索引不仅可以提高查询速度,还可以节省磁盘和IO操作。
7.索引列排序
Mysql查询时只会使用一个索引,如果where条件中已经使用了索引,那么order by中的列是不会使用索引的。
因此如果默认排序可以符合要求的情况下,不要使用排序操作;
尽量不要包含多个列的排序,如果需要最好给这些列创建合适的复合索引。
8.where语句中,不要在索引列上使用函数或进行运算

如果对索引列进行运算或使用函数,会导致索引失效。

9.where条件中使用<> 或 != 也会做全表扫描,IS NULL/ IS NOT NULL 有时也会使索引失效

索引失效一般是由于mysql优化器会对查询的数据做一个数量的预估,如果我们用 is null,有空字段的索引一般是非聚簇索引。这种索引我们进行一次查询后,得到的是聚簇索引的主键,然后我们再进行回表,才能得到数据,这样优化器会根据空值的多少,自动选择开销比较小的方案进行优化。比如我们空值比较少,这时非聚簇索引查找的数据比较精准,开销也比较少,mysql就会使用索引进行查询。反之,如果空值比较多,这样我们如果使用聚簇索引先查询满足条件的主键,然后再通过大量的回表操作,才能得到我们想要的查询结果,频繁的IO就会造成性能开销较大,mysql就会选择不走索引的查询方式。也就是说能不能用到索引,mysql是根据具体情况来决定的。

10.尽量避免使用OR来连接条件,这样也会导致索引失效。

如果查询语句的条件中,我们必须使用OR,我们可以采用union all来代替,比如:

select cname from t where id = 10 or id = 20;
-- 我们可以改写为
select cname from t where id = 10
union all
select cname from t where id = 20;
11. in 和 not in 也要慎用;
12.如果过滤的数值是连续的,能用between就不要用in;
13.如果条件中使用了变量,mysql也会放弃索引,进行全表扫描;

因为sql只有在运行时,才会解析变量值,而优化器是在执行器之前运行的。这样优化器就无法获得变量的值,因而无法做为索引过滤输入项。不过,我们可以强制查询使用索引,比如:

select cname from t where id = $sid;
-- 可以使用下面的sql进行优化:
select cname from t with(index(索引名)) where id = $sid;
14.在使用复合索引时,必须使用到该索引的第一个字段做为条件才能保证查询过程使用该复合索引。尽量保持条件字段顺序与索引字段顺序一致。
15.在优化过程中,很多时候会用exists 代替in。
16.字段有大量重复数据的时候不建议建立索引,即使建立索引,mysql一般也不会使用索引,即使使用对性能也影响不大。如果数据量比较大,也会增加维护成本。
17.索引并不是越多越好,索引能提高查询效率,但也同时降低了增、删、改的效率,因为insert、select有时可能会重建索引。一个表的索引数一般不超过6个。

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

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

相关文章

Gson的fromJson()方法

Gson提供了fromJson()方法来实现从Json相关对象到Java实体的方法。 在日常应用中&#xff0c;我们一般都会碰到两种情况&#xff0c;转成单一实体对象和转换成对象列表或者其他结构。 先来看第一种&#xff1a; 比如json字符串为&#xff1a;[{“name”:”name0”,”age”:0…

java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究...

前言&#xff1a;前一段时间apace solr JMX因为配置不当出现远程代码执行漏洞&#xff0c;最近自己在看一套java系统时&#xff0c;发现该系统也存在JMX远程代码漏洞&#xff0c;于是乎就想研究下JMX这种通用型漏洞&#xff0c;下面我就从原理到利用对该漏洞做一个简单的梳理。…

Java注解的Retention和RetentionPolicy

一 源码赏析 1 源码 Documented Retention(RetentionPolicy.RUNTIME) Target(ElementType.ANNOTATION_TYPE) public interface Retention {RetentionPolicy value(); }public enum RetentionPolicy {//此注解类型的信息只会记录在源文件中&#xff0c;编译时将被编译器丢弃&a…

hive UDF函数取最新分区

hive UDF函数取最新分区 1.pom文件 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1…

app每秒并发数_性能测试连载 (38) jmeter 线程数与性能测试的负载模式

点击跳转>>jmeter--由浅入深学性能系列需求下面有3个场景&#xff0c;思考一下在jmeter里面如何设计场景1&#xff1a;有一个项目&#xff0c;500用户同时登录&#xff0c;响应时间能达到多少场景2&#xff1a;考勤打卡&#xff0c;最大吞吐量能达到多少(每秒最大能完成多…

用自定义注解做点什么——自定义注解有什么用

用自定义注解做点什么 前言 你不一定听过注解&#xff0c;但你一定对Override不陌生。 当我们重写父类方法的时候我们就看到了Override。我们知道它表示父类方法被子类重写了。 现在告诉你&#xff0c;Override就是一个注解。 也许你会疑惑注解是什么&#xff1f; 注解&…

HIVE 优化浅谈

HIVE 优化浅谈 hive不怕数据量大&#xff0c;导致运行慢的主要原因是数据倾斜。hive的运行机制这里就不再赘述&#xff0c;咱们直入正题&#xff0c;聊一下hive的优化方法。 优化点一&#xff1a;业务逻辑优化 1.去除冗余逻辑 对于复杂业务逻辑来说&#xff0c;在非数据倾斜…

c++ 查找文件夹下最新创建的文件_云计算开发总结:搜索Linux文件和文件夹的方法...

当下&#xff0c;随着Linux在物联网、云技术、超级计算和人工智能等领域扮演关键角色&#xff0c;各种会议和新版本的发布令人应接不暇&#xff0c;Linux将迎来一个激动人心的“云时代”。如果你想把握这个风口&#xff0c;现在是学习Linux技术的最佳时期。今天千锋广州云计算培…

RSA 非对称加密原理

RSA 加密原理 步骤说明描述备注1找出质数P 、Q-2计算公共模数N P * Q-3欧拉函数φ(N) (P-1)(Q-1)-4计算公钥E1 < E < φ(N)E的取值必须是整数 E 和 φ(N) 必须是互质数5计算私钥DE * D % φ(N) 1-6加密C &#xff1d; M E mod NC&#xff1a;密文 M&#xff1a;明文7…

HIVE 数据倾斜浅谈

HIVE 数据倾斜浅谈 一、数据倾斜现象 map100%,reduce一直卡在一个值&#xff0c;如99%。 二、数据倾斜的原因 数据按key的hash值分配到reduce中&#xff0c;如果有的key值比较集中&#xff0c;就会导致某个或某些reduce分配的数据量太大&#xff0c;这样当其他reduce运行完毕…

es6 依赖循环_require 和 import 的循环依赖详解

说到前端模块化&#xff0c;就不得不说到循环加载&#xff0c;就像混乱背后隐藏着的清晰地秩序。什么叫循环加载&#xff1f;我们来看一段代码。12345678910111213const b require(./b);b();module.exports function(){console.log(This is a.js);}//b.jsconst a require(./…

浅谈对称加密与非对称加密

在数字加密算法中&#xff0c;通过可划分为对称加密和非对称加密。 一&#xff1a;什么是对称加密&#xff1f; 在对称加密算法中&#xff0c;加密和解密使用的是同一把钥匙&#xff0c;即&#xff1a;使用相同的密匙对同一密码进行加密和解密&#xff1b; 加密过程如下&…

ios跨线程通知_一种基于Metal、Vulkan多线程渲染能力的渲染架构

快手Y-tech 原创最新技术干货分享随着3D渲染场景规模越来越复杂&#xff0c;单线程渲染架构在满足业务性能要求时已经捉襟见肘&#xff0c;因此&#xff0c;多线程渲染显得愈发重要。本文首先介绍了新一代图形渲染接口Metal、Vulkan&#xff0c;以及它们的多线程渲染特性&…

58同城面试盘点

58同城面试盘点 1.一张订单表&#xff0c;有user_name,order_id,order_time,order_amount 四个字段&#xff0c;怎么取出每个用户2021年10月以来第一个订单的金额&#xff08;下单时间格式为’yyyy-MM-dd HH:mm:ss’&#xff09;&#xff1f; select user_name,order_id,orde…

stringbuffer判断是否为空

StringBuffer sbnew StringBuffer();if(sb!null && sb.length()>0){System.out.println("证明sb不为空!"); }

virtualbox: win11主机安装deepin双向复制问题

virtualbox: win11主机安装deepin双向复制问题1.安装virtualbox增强组件(确保光驱可用)2.终端挂载3. 运行BoxLinuxAdditions4. 重启虚拟机&#xff0c;验证OK&#xff01;使用virtualbox安装深度系统deepin虚拟&#xff0c;发现虚拟机和宿主机之间不能双向复制&#xff0c;已经…

基坑监测日报模板_刚刚!温州瓯海突发塌陷,初步判断为临近地块地下室基坑支护桩移位...

资料来源&#xff1a;瓯海新闻网 | 温州百事通 | 土木吧 | 岩土新鲜事 等版权归原作者所有如有侵权请联系删除9月10日中午11点左右&#xff0c;温州市瓯海区娄桥街道商汇路道路塌陷。塌陷路面位于商汇路的公交车站旁&#xff0c;几十米长的路面已经开裂&#xff0c;公交站台发生…

java 从一个总的list集合中,去掉指定的集合元素,得到新的集合——removeAll()

/*** 两个list集合的差集* author*/ public class ListSubstract {public static void main(String[] args) {List<String> list new ArrayList<>();//作为总的listList<String> existList new ArrayList<>();//存在的listlist.add("aa");…

virtualbox:win11上的deepin如何设置与宿主机共享文件

1. 安装virtualbox增强功能 这个没有测试&#xff0c;只是理论上需要。我在上一篇帖子《virtualbox: win11主机安装deepin双向复制问题》已经安装了增强功能&#xff0c;大家可以参考安装。 2.在virtualbox上配置共享 2.1 关闭虚拟机&#xff0c;进行设置 共享文件夹路径点击…

三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...

点击“高中数学资料共享”关注我们解三角形问题在高考中的选择、填空、解答题一般都会涉及到(最少也有两块涉及到)&#xff0c;其中有一类涉及角平分线长度、中线长、高线长度问题&#xff0c;难度不大&#xff0c;但运算量不小&#xff0c;那我们如果在考试中能在最短时间内把…