详细介绍MySQL的索引(下)

索引的使用

同一条数据在未创建索引的情况下耗时:

nick字段是未创建索引的

 select * from t_user WHERE nick = '邹丽';SHOW PROFILES;

耗时为:

user_account字段创建了唯一索引
 

 select * from t_user WHERE user_account = '13781945844';SHOW PROFILES;

查询耗时为:

当然以上的对比仍然是在表数据量较小的情况下,当表的数据量逐渐增多,创建索引的数据查询耗时是要远低于未创建索引的耗时。

索引失效 

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过了某一列,索引将部分失效(后面的字段索引失效)。

展示如下:

查看该表索引

show index FROM t_user;

可以看到为nick, authority,score这三个字段创建了联合索引,且创建顺序为nick,authority额,score。

按照索引正常查询
SELECT * from t_user WHERE nick = 'PIS' and authority = '1' and score = '11'

查看结果

查看索引覆盖情况

EXPLAIN SELECT * from t_user WHERE nick = 'PIS' and authority = '1' and score = '11';

观察可以发现,这里的索引并未失效。

当我们修改查询条件

EXPLAIN SELECT * from t_user WHERE nick = 'PIS' and authority = '1';

结果如下:

可以发现索引仍未失效。

当我们修改查询顺序

EXPLAIN SELECT * from t_user WHERE authority = '1' and score = '11' and nick = 'PIS';

 

MySQL会进行查询优化,当最左边的索引条件出现后,但可能不符合创建索引的顺序时,MySQL会自动优化查询,将查询条件重新组合。 

最左前缀法则
EXPLAIN SELECT * from t_user WHERE nick = 'PIS' and score = '11';

可以看到score索引发生了失效,这是因为没有符合最左前缀法则。

再举一个例子

EXPLAIN SELECT * from t_user WHERE authority = '1' and score = '11';

这里可以看到,索引全部都失效了。

范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。

这里将authority字段类型改成int类型做测试
 

EXPLAIN SELECT * from t_user WHERE nick = 'PIS' and authority > 3 and score = '11';

 在业务允许的范围下,我们要进行范围查询最好带上等于号,比如>= 或者 <= 


EXPLAIN SELECT * from t_user WHERE nick = 'PIS' and authority >= 3 and score = '11';

 可以看到这样索引未失效。 

索引列运算

不要在索引列上进行运算操作,索引将失效。

查看索引情况

我们用user_account这个字段的唯一索引展示
正常未失效的情况如下:

explain SELECT * from t_user WHERE user_account = '17630150099';

 

在索引列上进行运算(包括函数运算)导致索引失效的情况如下:

explain SELECT * from t_user WHERE SUBSTRING(user_account,10,2) = '99';

 观察可知,索引发生了失效。

字符串不加引号

字符串类型字段使用时,不加引号,索引将失效。

explain SELECT * from t_user WHERE user_account = 17630150099;

可以发现,在唯一索引user_account中查询的时候未加引号,可以导致索引失效。

模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

索引失效例子:

explain SELECT * from t_user WHERE nick LIKE '%I';

索引未失效例子:

explain SELECT * from t_user WHERE nick LIKE 'I%';

 

 OR连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。

 SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

user index: 告知数据库要用哪个索引。

SELECT * from t_user USE INDEX(user_index) WHERE user_account = '17630151111';

ignore index: 告知数据库忽略哪个索引。

SELECT * from t_user IGNORE INDEX(user_index) WHERE user_account = '17630151111';

force index:  强制数据库必须用某个索引。

SELECT * from t_user FORCE INDEX(user_index) WHERE user_account = '17630151111';

覆盖索引

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中色经全部能够找到),减少select *。

因为如果在查询的字段中出现了非索引的字段,那么将会发生回表查询,即查询了两次,性能相对于查询一次的较差。

在explain执行计划中有一列是Extra


using index condition/ Null :查找使用了索引,但是需要回表查询数据。

using where; using index : 查找使用了索引,但是需要的数据都在索引列中能找到一所以不需要回表查询数据。

 前缀索引

当字段类型为字符串(varchar , text等),时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀抽取出来,建立索引,这样可以大大节约索引空间,从而提高索引效率。

创建前缀索引的语法

如下:

create index id_xxx on table_name(column(n))

column(n) 代表我要截取某个字段的钱n个字符来创建索引。

前缀索引的长度 

可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

计算公式 :

select count (distinct substring(column,x,y))/count(*) from table;

 算出来的值越趋近于一说明性能也是越好的,但是当y远大于x时,索引的存储空间也是一个需要考虑的问题。因此要根据实际的业务来选择。

单列索引&联合索引

单列索引:即一个索引只包含单个列。

联合索引:即一个索引包含了多个列。

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

多条件联合查询时,MySOL优化器会评估哪个字段的索引效率更高,会选择该索引完成本次查询。

适当的覆盖索引使用可以避免回表查询,从而提升查询性能。

索引设计的原则

1.针对于数据量较大(超过一百多万),且查询比较频繁的表建立索引。

2.针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。

3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。

5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

6.要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

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

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

相关文章

PHP验证日本固定电话号码

日本电话号码格式众多&#xff0c;验证起来比较头大&#xff0c;现在咱们来一个简单的总结哈 为了简单起见&#xff0c;使用PCRE 函数preg_match通过匹配正则表达式来实现验证。 function checkGdTelLandline(string $str): int|false {return preg_match("/\A0(\d{1}[-…

安装 VisualSVN Server提示HTTP服务无法启动的问题解决

安装 VisualSVN Server 版本&#xff1a;VisualSVN-Server-5.4.0-x64 安装包在安装到一半的时候&#xff0c;弹窗提示&#xff1a;HTTP服务无法启动&#xff0c;网上找了一大堆&#xff0c;说是service里面更改用户为本地用户什么的都没用用&#xff0c;点右键也无法启动。 …

配置Uptime Kuma固定前缀

在做ICT集成项目时&#xff0c;遇到需要对现网接口进行拨测的需求。搜索后尝试使用开源的Uptime Kuma组件完成现网接口拨测。 但该项目有个问题就是默认不支持配置固定前缀&#xff0c;这对现网进行请求转发会造成较大的影响。通过查看该项目的github后找到了问题的解决方案。S…

web自动化(三)鼠标操作键盘

selenuim 键盘操作 import timefrom selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selen…

SQL语言基础特点、数据库系统

一、SQL的概述 &#xff08;1&#xff09; SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 &#xff08;2&#xff09;SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公…

Leetcode秋招冲刺(专题10--12)

专题10&#xff1a;动态规划 题目509&#xff1a;斐波那契数&#xff08;NO&#xff09; 解题思路&#xff1a;动态五部曲 动态五部曲&#xff1a;这里我们用一个一维数组来保存递归的结果 确定dp数组以及下标的含义 dp[i]的定义为&#xff1a;第i个数的斐波那契数值是dp[i]…

韩语日常口语留学韩语旅游韩语口语柯桥语言培训

韩语每日一词打卡&#xff1a;행정적[행정적]【名词】行政 原文:나라는 항상 행정적 명령을 통해 경제운행을 조절합니다. 意思&#xff1a;国家经常通过行政命令去调节经济的运行。 【原文分解】 1、항상[항상]总是 &#xff0c;经常 2、나라[나라]国家 3、명령[명:녕]命令 …

项目2:API Hunter 细节回顾 -1

一. 接口调用 对于开发者来说&#xff0c;接口的调用应当是方便快捷的&#xff0c;而且出于安全考虑&#xff0c;通常会选择在后端调用第三方 API&#xff0c;避免在前端暴露诸如密码的敏感信息。 若采用 HTTP 调用方式&#xff1a; HttpClientRestTemplate第三方库&#xf…

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

视图库对接系列(本级)注册 在之前的步骤中&#xff0c;我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。 GA-T 1400中的步骤如下&#xff1a; 这里的话&#xff0c;我们实现的简单点&#xff0c; 我们不进去鉴权&#xff0c;也就是设备或平台找我们注册的话&…

Python高速下载及安装的十大必备事项与C++联调

选择正确的版本&#xff1a; 访问Python官网&#xff08;https://www.python.org/&#xff09;下载最新稳定版本&#xff0c;目前最新稳定版本为3.12.4 避免下载并安装Python 2.x版本&#xff0c;因为它已经停止维护。 选择适合操作系统的安装包&#xff1a; 根据你的操作系…

【笔记】太久不用redis忘记怎么后台登陆了

&#xff01;首先启动虚拟机linux的centos7 2.启动finalshell 我的redis启动在根目录用 redis-server redis.conf --启动 systemctl status redis --查看redis状态 是否active redis-cli -h centos的ip地址 -p 你要用的redis端口号&#xff08;默认为6379&#xff09; -a 你…

uboo对内存操作读写命令的基本使用

内存操作命令 直接对DRAM进行读写的操作,uboot常用的内存操作命令有md,nm,mm,mw,cp和cmp. md命令: 显示内存值 # md md - memory display Usage: md [.b, .w, .l, .q] address [# of objects] b:1个字节 byte w:2个字节 world l:4个字节 long of objects 以word 为单位的1…

MySQL:保护数据库

保护数据库 1. 用户1.1 创建用户1.2 查看用户1.3 删除用户1.4 修改密码 2. 权限2.1 授予权限2.2 查看权限2.3 撤销权限 之前都是介绍本地数据库而你自己就是数据库的唯一用户&#xff0c;所以不必考虑安全问题。但实际业务中数据库大多放在服务器里&#xff0c;你必须妥善处理好…

版本控制系统:Git 纯应用(持续更新);

基本操作 ctrl上行键&#xff1a;上次代码 本地仓库&#xff1a;Git init 新建文件&#xff1a;touch xxxx.xxx 查看状态&#xff1a;Git status 文件从工作区——暂存区&#xff1a;Git add ./文件名(.是通配符代表所有) 暂存区——仓库&#xff1a;Git commit -m &…

论文阅读之旋转目标检测ARC:《Adaptive Rotated Convolution for Rotated Object Detection》

论文link&#xff1a;link code&#xff1a;code ARC是一个改进的backbone&#xff0c;相比于ResNet&#xff0c;最后的几层有一些改变。 Introduction ARC自适应地旋转以调整每个输入的条件参数&#xff0c;其中旋转角度由路由函数以数据相关的方式预测。此外&#xff0c;还采…

使用 Ollama 时遇到的问题

题意&#xff1a; ImportError: cannot import name Ollama from llama_index.llms (unknown location) - installing dependencies does not solve the problem Python 无法从 llama_index.llms 模块中导入名为 Ollama 的类或函数 问题背景&#xff1a; I want to learn LL…

【postgreessql 】统计库中的所有表数量

在PostgreSQL中&#xff0c;你可以使用SQL查询来统计数据库中的所有表数量。这通常涉及到查询系统目录表&#xff0c;特别是 pg_catalog.pg_tables 表&#xff0c;它存储了关于数据库中所有表的信息。 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN …

mysql逗号分割字符串“1,2,3”实现in查询

数据示例 前台单值参数实现in查询 主要函数FIND_IN_SET 该函数的作用是查询字段(strlist) 中是否包含(str)的结果&#xff0c;返回结果为 null或记录 select id,recommend_position_id from t_stk_task where FIND_IN_SET(359919,recommend_position_id)查询效果 前台集…

【软件测试】性能测试 | 概念 | 常见术语 | 性能指标 | 分类 | 流程

性能测试 文章目录 性能测试一、什么是性能测试1.生活中遇到的软件的性能问题2.性能测试定义3.性能测试和功能测试有什么区别4.什么样的表现属于软件性能好、什么样的表现不好5.影响一个软件性能因素有哪些 二、为什么进行性能测试三、性能测试的常见术语以及性能测试的衡量指标…

C++部分复习笔记下

7. C11 范围for 使用格式 vector<int> v { 1,2,3,4,5 }; for (auto e : v) {cout << e << " "; } cout << endl;底层原理&#xff0c;使用迭代器 vector<int> v { 1,2,3,4,5 }; auto it v.begin(); while (it ! v.end()) {cout…