MySQL 高阶三 (索引性能分析)

执行过程 Explain

 explain select * from student s, course c , student_coure sc where s.id = sc.studentid and c.id = sc.courseid;

在这里插入图片描述
EXPLAIN执行计划各字段含义:

【ld】 id相同,执行顺序从上到下; id不同,值越大,越先执行)。
【select_type】表示SELECT的类型,常见的取值有SIMPLE〈简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY (SELECT/WHERE之后包含了子查询)等
【key_len】 用到的索引长度,越短越好。

重点关注:【type】【possible_key】【key】
【type】表示连接类型,性能由好到差的连接类型为null > system > const > eq_ref > ref > range > index > all。
type = null 和 system: 一般不查询业务表,比如 select ‘A’
type = const: 主键或者unquie时,比如,select * from user where id= 1 或者 where idCard = 3423…
type = eq_ref 和 ref: 字段创建了索引 select * from user where name= ‘张三’ name 前提是建立了所以。
type = range ,常见于<、<=、>、>=、between等操作符(explain select * from user where age> 10 and user < 20),前提 age 字段必须是 unique 或者时主键 对数据建立了数据结构,否则依然能是 ALL 全文扫描。
type = index: 创建了索引,但是也是全字段扫描,说明索引效果不佳。
type = all: 没有创建索引的字段查询都是ALL explain select * from user where name= ‘zhangsan’
【possible_key】 可能用的的索引,如果是null 说明没用索引
【key】实际用到的索引

索引使用规则:

索引规则

1、最左前缀法则:

当使用联合索引时:要求查询时必须包含最左边的列:例如:(下面创建的索引  username 是最左边的列)

在这里插入图片描述

EXPLAIN select * from users where username='test' -- 有效EXPLAIN select * from users where username = 'test' and phone='18061581849'  and age=1 -- 有效EXPLAIN select * from users where username = 'test' and phone='18061581849'  -- 无效EXPLAIN select * from users where username='test'  and phone='18061581849'   -- username 有效  phone无效 因为中间缺少 age 导致索引只有执行了部分 可以观察 keylenEXPLAIN select * from users where username  = 'test' and age >1  and phone='18061581849' -- 部分有效 age使用了范围查询,导致 phone 失效,正确用法,改成 >= 

总结: 联合索引,查询必须包含索引中最左边的列,并且如果跳过中间的列,那么后面的列的索引将会失效。
使用返回查询时,会导致,部分索引失效,正确做法,使用>= 符合代替
下面两张图,的key_len 表名了 生效字段的长度。 username = 195 age = 5 phone = 195 全部生效就是 395
在这里插入图片描述
username + age = 200
在这里插入图片描述

不要在索引列上使用计算操作。

在这里插入图片描述

select * from users where  substring(phone,10,2)='49' -- 使用了计算,导致失效
查询类型要匹配。
EXPLAIN select * from users where phone = 18061581849  -- 无效 本来是字符串 忘记单引号 变成数字类型,导致索引失效。

在这里插入图片描述

模糊查询 ,后面模糊有效,前面无效。

在这里插入图片描述

EXPLAIN select * from users where id=1 or age = 1  -- id 和 age都必须有索引,否则索引失效

注意:如果 age是联合组件,那么age 必须遵从最左前缀法则。否则也无效。

数据分布影响

当前数据:
在这里插入图片描述

EXPLAIN select * from users where phone>='18961511111'  -- 会使用索引,要查询的数据较少时,使用索引效率较高。
EXPLAIN select * from users where phone>='111'  -- 不会使用索引,数据涵盖的范围很大,使用索引效率更低。
--同理  is null 和 is not null 走不走索引取决于查询的结果相对一总数据是 大多数还是少数,少就用索引,反之不用。

索引指定

-- 当表的phone 字段有联合索引和单列索引时,可以指定或者忽略使用该索引
use index(idx_users_phone) -- 建议MySQL使用 idx_users_phone 索引
ignore index(idx_uses_phone) -- 忽略MySQL使用 idx_users_phone 索引
force index(idx_users_phone) -- 强制MySQL使用 idx_users_phone 索引
--使用方式如下:
select * from users use index(idx_users_phone) where phone = '123123123';

为什么不要 select * 因为会触发回表查询,所以如果数据量比较大,查询是可以建立联合索引。增加性能。但要注意,索引太多也会导致插入效率变低。

在这里插入图片描述

EXPLAIN select id,username,nickname FROM users WHERE username = 'test' -- using index 表示只用到idx_phone 索引所以效率很高

在这里插入图片描述

EXPLAIN select id,username,nickname,age FROM users WHERE username = 'test' --age 用到了回表查询
EXPLAIN select * FROM users WHERE username = 'test'  --用到了回表查询

在这里插入图片描述

前缀索引 ,用于txt 大文本索引。

create index idx_users_mark on users(mark(5))  --针对mark字段的前5个字符创建索引,注意如果重复数据太多不具备效果。EXPLAIN select mark FROM users where mark like "星星%"; -- 仅仅支持后模糊查询。

索引的设计原则:

1、数据量较大(100w条以上),查询较频繁的标建立索引
2、针对 【where】 【order by】【group by】 操作的字段建立索引。
3、尽量选择区分度高的列作为索引。(例如:身份证号 ),重复数据较多的数据,建立索引效果差例如,性别。
4、更具查询的结果列,来创建使用联合索引,避免回表,和遵从最左前缀法则。
5、索引可以提高查询效率,也会影响修改效率。
6、索引列尽量,使用not null约束,可以提升查询效率,因为null在索引中要做特殊处理。

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

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

相关文章

C语言程序设计(初识C语言后部分)

1024M1GB&#xff0c;1GB1级棒。关爱一级棒的程序员们&#xff0c;宠TA没商量&#xff01; 5&#xff09;函数的嵌套调用和链式访问 函数和函数之间可以根据实际的需求进行组合的&#xff0c;也就是相互调用的。 1.嵌套调用 函数可以嵌套调用&#xff0c;但不可以嵌套定义&a…

作业帮 TiDB 7.5.x 使用经验

作者&#xff1a; 是我的海 原文来源&#xff1a; https://tidb.net/blog/5f9784d3 近期在使用 TiDB 时遇到的一些小问题的梳理总结&#xff0c;大部分版本都在6.5.6和7.5.2 1、limit 导致的扫描量过大的优化 研发定时任务每天需要扫描大量数据&#xff0c;到时机器网卡被…

TCP并发服务器模型

1.阻塞IO CPU占用率低,等待资源时将任务挂起,不占用CPU资源,等到拿到资源后继续向下执行 向管道中写入数据 write.c #include "../head.h" int main() {int fd;mkfifo("/tmp/myfifo",0777);char tmpbuff[100]{0};fdopen("/tmp/myfifo",O_WRON…

三十八、【人工智能】【机器学习】【监督贝叶斯网络(Bayesian Networks)学习】- 算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

39_WAF的概念、功能,ModSecurity部署配置、LAMP环境部署、Ubuntu搭建DVWA靶机测试、测试WAF防御、OWASP规则集的部署

一、WAF的概念 WAF&#xff08; Web Application Firewall &#xff09;&#xff0c;即Web应用防火墙 通过执行一系列HTTP/HTTPS&#xff08;应用层的协议&#xff09;的安全策略为Web应用提供保护的一种网络安全产品。增加攻击者的难度和成本&#xff0c;但不是100%安全。工…

halcon的HObject被释放

经过简述 某项目由我统一管理HObject(区域和图像)的释放。发现某区域被系统外部所释放。可能有两种情况&#xff1a;a&#xff0c;区域交给我后&#xff0c;释放了。b&#xff0c;获取我的区域后释放了。 最终证明是第二种情况&#xff0c;证明如下&#xff1a; a&#xff0c;…

Python数据分析:Pandas与NumPy结合,实现高效数值计算,提升数据分析效率的最佳实践

目前小编的借调任务已经完成&#xff0c;借调到其他组完成了自己的工作&#xff0c;有需要的同学可以看下相关的文章&#xff1a;Python&#xff08;Flask&#xff09; React && Golang&#xff08;Gin&#xff09; Vue(Element)&#xff0c;然后小编认为可以回到原来的…

深入探讨 Nginx:安装、配置及优化指南

一、Nginx 概述及编译安装 1、概述 Nginx是一个高性能的开源HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3邮件代理服务器。它最初由Igor Sysoev于2002年开发&#xff0c;并于2004年首次发布。Nginx以其高并发性、低资源消耗和灵活的配置能力而受到广泛关注&#x…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 近期&#xff0c;微软披露了一个最…

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor

双亲委派机制的优势与劣势

三次双亲委派机制的破坏

反向代理:定义与核心作用

反向代理&#xff1a;定义与核心作用 一、反向代理的定义二、反向代理的核心作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 反向代理&#xff0c;作为网络架构中的重要组件&#xff0c;扮演着关键角色。本文将简洁介绍反向代理的定义及…

整体思想以及取模

前言&#xff1a;一开始由于失误&#xff0c;误以为分数相加取模不能&#xff0c;但是其实是可以取模的 这个题目如果按照一般方法&#xff0c;到达每个节点再进行概率统计&#xff0c;但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…

【区块链+商贸零售】预付宝:商家数字经济服务平台 | FISCO BCOS应用案例

预付宝商家数字经济服务平台是人民链在金融领域落地的 一个区块链应用&#xff0c;致力于营造诚信消费环境&#xff0c;专治诸如健 身房老板卷款跑路、充值后餐馆倒闭钱拿不回来等令消费 者头疼不已的行业乱象&#xff0c;让消费者可以放心地预付费。 平台应用FISCO BCOS区块链…

设计模式学习[3]---单一职责原则+开放封闭原则

文章目录 前言1. 单一职责1.1 原理阐述1.2 处理方式 2. 开放-封闭原则2.1 原理阐释2.2 举例说明 总结 前言 小项目写多了&#xff0c;比如一些什么管理系统之类的&#xff0c;在接触大型项目的时候往往会将之前的一些面向过程的写法代入。 比如UI以及逻辑处理都放在一个类里面…

Flutter【01】状态管理

声明式编程 Flutter 应用是 声明式 的&#xff0c;这也就意味着 Flutter 构建的用户界面就是应用的当前状态。 当你的 Flutter 应用的状态发生改变时&#xff08;例如&#xff0c;用户在设置界面中点击了一个开关选项&#xff09;你改变了状态&#xff0c;这将会触发用户界面…

25届科大讯飞飞星计划 AI研究算法工程师 面经

目录 一面/技术面 2024/08/15 &#x1f4cb; 总结&#xff1a; 本来应该是在7月底面试的&#xff0c;但因为有事就拖到了现在&#xff0c;或许是飞星计划里最晚面试的一批&#xff1f;面试官很和蔼&#xff0c;问的问题不算难&#xff0c;总体体验还算不错。 一面/技术面 2024/…

洛谷B3981题解

题目描述 &#xff08;你不需要看懂这张图片&#xff1b;但如果你看懂了&#xff0c;会觉得它很有趣。&#xff09; JavaScript 是一种功能强大且灵活的编程语言&#xff0c;也是现代 Web 开发的三大支柱之一 (另外两个是 HTML 和 CSS)。灵活的 JavaScript 包含“自动类型转换…