MySQL调优、索引是什么、如何创建索引、索引的作用、索引失效场景

索引

索引是一种数据结构。用于加快对数据库的查询速度以及性能。
MySQL 索引类似于书籍的索引,通过存储指向数据行的指针,可以快速定位和访问表中的特定数据。

打个比方,如果合理的设计且使用索引的 MySQL 是一辆兰博基尼的话,那么没有设计和使用索引的 MySQL 就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引的类型以及使用

普通索引

一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复、NULL值插入。

CREATE INDEX IndexName ON `TableName`(`字段名`(length));
# 或者
ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length));

主键索引

一张表只能有一个主键索引,不允许重复、不允许为 NULL;

 ALTER TABLE TableName ADD PRIMARY KEY(column_list); 

唯一索引

数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));
# 或者
ALTER TABLE TableName ADD UNIQUE (column_list); 

全文索引

它查找的是文本中的关键词,主要用于全文检索。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)

组合索引

一个组合索引包含两个或两个以上的列。查询的时候遵循 mysql 组合索引的 “最左前缀”原则,即使用 where 、order by时条件要按照建立索引的时候字段的排列方式放置索引才会生效。

CREATE INDEX index_name
ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);

显示索引信息

SHOW INDEX FROM table_name\G
-- \G: 格式化输出信息

在这里插入图片描述

解读表中字段的含义

1、Non_unique:如果索引不能包括重复值则为0,如果可以则为1。也就是平时所说的唯一索引。
2、Key_name:索引名称,如果名字相同则表明是同一个索引,而并不是重复,比如上图中的第二、三条数据,索引名称都是nick_sex_index,其实是一个联合索引。
3、Seq_in_index:索引中的列序列号,从1开始。上图中的二、三条数据,Seq_in_index一个是1一个是2,就是表明在联合索引中的顺序,我们就能推断出联合索引中索引的前后顺序。
4、Column_name:索引的列名。
5、Collation:指的是列以什么方式存储在索引中,大概意思就是字符序。
6、Cardinality:是基数的意思,表示索引中唯一值的数目的估计值。我们知道某个字段的重复值越少越适合建索引,所以我们一般都是根据Cardinality来判断索引是否具有高选择性,如果这个值非常小,那就需要重新评估这个字段是否适合建立索引。
7、Sub_part:前置索引的意思,如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
8、Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。压缩一般包括压缩传输协议、压缩列解决方案和压缩表解决方案。
9、Null 如果列含有NULL,则含有YES。
10、Index_type表示索引类型,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

删除索引

DROP INDEX index_name ON table_name;
-- 或者
ALTER TABLE table_name
DROP INDEX index_name;

什么情况下需要使用索引

1、表的主外键都必须有索引;
2、记录数多的表应该有索引;(一般数据量达到300万-500万时考虑建立索引。)
3、常与其他表进行连接的表,在连接字段上应建立索引;
4、常出现在where后面的字段需要建立索引;
5、索引应当建立在小字段上,对于大的文本字段甚至超长的字段不建;
6、查询中的统计、分组字段;

不合适使用索引的场景

1、频繁更新的字段、表;
2、数据重复且分布平均的字段(由于大量的重复,索引对性能的提升很有限,比如年龄、性别…

Explain

在sql前面加explain的作用是分析当前sql的执行计划信息。
在这里插入图片描述

字段含义

1、select_type

每个select对应一个select_type,表示select的复杂度

SIMPLE:简单查询。查询不包含子查询和union;
在这里插入图片描述

PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的(select * from user where id = 1)那个查询的select_type值就是PRIMARY;
在这里插入图片描述

SUBQUERY:包含在 select 中的子查询(不在 from 子句中);
在这里插入图片描述

DERIVED:对于包含‘派生表’的查询;

UNION:在 union 中的第二个和随后的 select(select * from user where id =30)
在这里插入图片描述

2、type

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL一般来说,得保证查询达到range级别,最好达到ref

null:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表
在这里插入图片描述

system:表中只有一行数据。属于 const 的特例。如果物理表中就一行数据为 ALL

const :查询结果最多有一个匹配行。因为只有一行,所以可以被视为常量。const 查询速度非常快,因为只读一次。一般情况下把主键或唯一索引作为唯一条件的查询都是 const
在这里插入图片描述

eq_ref:查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数据不能有重复数据,且这些数据都必须在主键表中有对应数据(主键表中数据可以有没有用到的)
在这里插入图片描述

ref:比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
1、简单查询,nick_name是普通索引不是唯一索引
在这里插入图片描述
range:把这个列当作条件只检索其中一个范围。常见 where 从句中出现 between、<、>、>=、in 等。主要应用在具有索引的列中
在这里插入图片描述

index:只遍历索引树,通常比All快。因为,索引文件通常比数据文件小,也就是虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读的。

ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。
在这里插入图片描述

3、possible_keys

这个字段表示在查询时当前sql可能用到的索引,但是不一定真的使用,只是一种可能。

分析某条sql时,如果key列字段为null,但是possible_keys有值。说明mysql觉得可能会使用sql,但因为表中数据少,使用索引反而没有全表扫描效率高,那么mysql就不会使用索引查找,这种情况是可能发生的。

tips:如果出现以上情况,我们也可通过where后面的条件来适当建立索引提高性能。

4、key

sql真正使用到的索引字段。

5、key_len

用到的索引字段的长度。

6、ref

表示那些列或常量被用于查找索引列上的值,
ref列展示的就是与索引列作等值匹配的值什么,比如只是一个常数或者是某个列。
在这里插入图片描述

7、rows

表示在查询中检索了多少列,但是并不一定是返回那么多数据。

8、Extra

一些额外信息。

失效场景

1、不满足最左原则:在联合索引中,最左侧的字段优先匹配。因此,在创建联合索引时,where子句中使用最频繁的字段放在组合索引的最左侧。
而在查询时,要想让查询条件走索引,则需满足:最左边的字段要出现在查询条件中。
在这里插入图片描述
在这里插入图片描述
2、查询条件中有or即使部分条件带索引也会失效
在这里插入图片描述
在这里插入图片描述
type=ALL, 进行了全表扫描未命中索引。
总结:查询条件中带or的查询,除非所有的条件都有索引否则不会走索引。
3、like查询使用%开头的
非模糊查询:
在这里插入图片描述
使用模糊查询后:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2c5fcf26c195423fbae
4、如果列类型是字符串,那在查询条件中需要将数据用引号引用起来,否则不走索引
在这里插入图片描述
在这里插入图片描述
5、索引列上参与计算
在这里插入图片描述

MYSQL性能调优

我们可以从四个方面进行优化:架构、硬件、DB、SQL。位置越靠前优化越明显,对数据库的性能提升越高。我们常说的SQL优化反而是对性能提高最小的优化。

架构优化

一般来说对于高并发场景下对架构优化其效果最明显。如:分布式缓存、读写分离、分库分表。

分布式缓存

性能不好,缓存来凑。在中间加一个redis。
当接收到查询时,先去缓存中查询一遍如果没命中,就查询数据库,否则加载数据库并同步到redis。这样就大大减少了对数据库的访问次数,自然而然也提高了数据库性能。

读写分离

一主多从,读写分离,主动同步,是一种常见的数据库架构优化手段。
一般来说当你的应用是读多写少,数据库扛不住读压力的时候,采用读写分离,通过增加从库数量可以线性提升系统读性能。

主库,提供数据库写服务;从库,提供数据库读能力;主从之间,通过binlog同步数据。

当准备实施读写分离时,为了保证高可用,需要实现故障的自动转移,主从架构会有潜在主从不一致性问题。

水平切分

水平切分,也是一种常见的数据库架构优化手段。
当你的应用业务数据量很大,单库容量成为性能瓶颈后,采用水平切分,可以降低数据库单库容量,提升数据库写性能。

TIPS

  1. 读写分离主要是用于解决 “数据库读性能问题”
  2. 水平切分主要是用于解决“数据库数据量大的问题”
  3. 分布式缓存架构可能比读写分离更适用于高并发、大数据量大场景。

DB优化

QL执行慢有时候不一定完全是SQL问题,手动安装一台数据库而不做任何参数调整,再怎么优化SQL都无法让其性能最大化。要让一台数据库实例完全发挥其性能,首先我们就得先优化数据库的实例参数。

数据库实例参数优化遵循三句口诀:日志不能小、缓存足够大、连接要够用。

数据库事务提交后需要将事务对数据页的修改刷( fsync)到磁盘上,才能保证数据的持久性。这个刷盘,是一个随机写,性能较低,如果每次事务提交都要刷盘,会极大影响数据库的性能。数据库在架构设计中都会采用如下两个优化手法:

  1. 先将事务写到日志文件RedoLog(WAL),将随机写优化成顺序写
  2. 加一层缓存结构Buffer,将单次写优化成顺序写

所以日志跟缓存对数据库实例尤其重要。而连接如果不够用,数据库会直接抛出异常,系统无法访问。

SQL优化

1、合理使用索引索引

少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

2、使用UNION ALL替代UNION

UNION ALL的执行效率比UNION高,因为UNION执行时需要排重;

3、避免select * 写法

执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

4、JOIN字段建议建立索引
5、避免复杂SQL语句

提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes----基础命令合集

目录 一、命令概述 1.1命令分类 1.2 基本语法 二、查看基本信息 2.1 环境指令 2.1.1 查看版本信息 2.1.2 查看资源对象简写 2.1.3 添加补全信息 2.1.4 查看日志 2.1.5 查看集群信息 2.2 查看资源信息 2.2.1 获取资源相关信息 ① 查看集群组件状态 ② 查看命名空间…

Linux入门3——vim的简单使用

1.vim 1.1 vim的模式 vim有三种主要模式&#xff1a; ①命令模式&#xff1a;使用vim刚打开进入的模式就是命令模式&#xff1b; ②插入模式&#xff1a;只有在插入模式下才可以做文字输入&#xff0c;按[Esc]键可退回命令模式&#xff1b; ③末行模式&#xff1a;文件保存或退…

【Java】并发革命:线程池

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在当今软件开发领域&#xff0c;多线程编程已成为提升应用性能的核心技术。随着业务需求的增长&#xff0c;线程的频繁创建和销毁不仅增加了系统的开销&#xff0c;也影响了程序的运行效率。 尽管线…

鸿蒙开发(NEXT/API 12)【蓝牙服务开发】网络篇

概述 蓝牙技术是一种无线通信技术&#xff0c;可以在短距离内传输数据。它是由爱立信公司于1994年提出的&#xff0c;使用2.4 GHz的ISM频段&#xff0c;可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机等各种设备。特点是低功耗、低成本、…

面试笔记-js基础篇

1、因为在 JS 的最初版本中&#xff0c;使用的是 32 位系统&#xff0c;为了性能考虑使用低位存储了变量的类型信息&#xff0c;000 开头代表是对象&#xff0c;然而 null 表示为全零&#xff0c;所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了&#xff…

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…

迷你洗衣机实不实用?五款精良内衣洗衣机专业实测!

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

数据分析-30-7万条天猫订单数据分析

文章目录 项目说明Part 11、数据说明及分析目录2、数据理解与处理3、数据分析可视化3.1 整体情况3.2 地区分析3.3 时间分析 Part 21、数据说明及分析目录2、数据理解及处理3、数据分析与可视化3.1 每日整体销售量走势3.2 谁家的化妆品卖的最好3.3 谁家的化妆品最贵 Part31、数据…

2024年还不知道如何清理c盘?最齐全的C盘清理指南!(非常详细)零基础入门到精通,收藏这一篇就够了

这段时间以来&#xff0c;我收到最多的问题还是问如何解决C盘爆满&#xff0c;那么今天就来给大家详细讲述一下该怎么给C盘“瘦身”。 我之前在文章《带你全面了解你的C盘&#xff01;并且给它“瘦身”&#xff01;》中讲到过C盘各个文件夹的作用&#xff0c;也提到过一些清理…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

车牌检测系统源码分享

车牌检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

骨传导耳机哪个牌子好?五大选购妙计带你精准入手优质骨传导耳机!

随着骨传导耳机市场的蓬勃发展&#xff0c;此产品凭借优秀的佩戴体验以及可降低听力损伤等优点引起了广泛的关注。然而&#xff0c;随着热度提高&#xff0c;市面上开始出现了许多品牌&#xff0c;这些品牌实力技术各不相同&#xff0c;甚至其中还有一些劣质机型&#xff0c;这…

imageJ 将多图中的同一条划线数据用曲线展示

1、导入图片&#xff0c;将所需的图片放进同一个文件夹&#xff0c;按顺序命名 2、划线 3、导出数据及画曲线 1&#xff09;得到单图的曲线上的图像数据&#xff1a;选中图片 -----> ctrl k 2&#xff09;将多张图像的同一条曲线位置的图像数据在同一数轴上画出曲线 步骤…

ChatGPT可以分析股票吗?

结合国庆前大A股市的小波牛市以及今天的股市表现&#xff0c;我从多个角度为你提供一些分析和建议&#xff1a; 一、国庆前的小波牛市分析 国庆前&#xff0c;大A股市出现了一波小幅上涨&#xff0c;市场呈现出一些积极的信号&#xff1a; 政策面利好&#xff1a;政府出台了…

张博,在压力下保持松弛的研一字节“老员工”|MarsCoders 开发者说

「MarsCoders 开发者说」是 AI 时代下各类技术栈、各种经历的开发者的故事记录&#xff0c;我们捕捉并再现他们在技术洪流中的职场蜕变与角色定位重塑&#xff0c;希望给更多开发者带来启发。 同时&#xff0c;该系列也记录了众多豆包MarsCode 用户和 AI 爱好者们的实践案例&am…

SQLite Developer使用说明

1.SQLite Developer下载 SQLite Developer官方版是SharpPlus出品的一款数据库管理工具。支持对sqlite3数据库的管理&#xff0c;能够自动完成窗口显示和执行数据库命令等多种特色。并且支持打开.db文件&#xff0c;适用于Android的开发。另外&#xff0c;使用Sqlite Developer…

如何防止源代码泄密?十种有效方法防止源代码泄密

关于深圳德信仁合信息有限公司的天锐绿盾产品&#xff0c;该产品专注于企业数据防泄漏&#xff0c;特别是源代码等核心技术资料的保护。以下是根据您提到的需求&#xff0c;即如何防止源代码泄密的十种有效方法&#xff0c;基于天锐绿盾产品的特点进行的归纳&#xff1a; 一、动…

windows11下面使用Pyinstaller打包python程序

文章目录 一、安装Python二、安装pip三、通过pip安装pyinstaller四、使用pyinstaller打包python为二进制程序参考 一、安装Python 我这里直接下载的是Python的可执行程序包&#xff0c;打开即用的版本&#xff0c; 也可以按照以下的教程安装python工具到windows上面 &#…

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…

AI 写作工具大比拼:揭秘 Claude 的神秘魅力以及如何订阅 Claude

AI 写作困境与 Claude 的惊喜表现 最近有很多朋友在吐槽 AI 写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有…