当前位置: 首页 > news >正文

【Mysql】之索引详解

一、索引基础

1.1  定义

        索引是一个排序的列表,包含索引字段的值及其对应的行数据记录所在的物理地址.

1.2  作用

        加快数据表的查询速度(主要作用),还可以对字段排序,加快表与表的连接速度,减少分组和排序的时间

1.3  副作用

        索引会额外占用磁盘空间;更新包含索引的表会花费更多时间

二、工作方式

        没有索引的情况下,要查询某行数据记录时,需要先扫描全表,再定位某行数据记录的位置。

        有了索引后,会先通过索引查询行数据记录所在的物理地址,即可直接访问相应的行数据记录,就像通过书的目录页码快速查找书内容一样。

三、创建索引的依据

1、表的行数据记录较多时(一般超过三五百行时),且读操作多的情况下应该要创建索引

2、建议在表的 主键/外键字段、多表连接的公共字段、唯一性较好的字段、不经常更新的字段、where条件的字段、group by分组的字段、order by排序的字段、简短的字段 上面创建索引

3、不建议在 唯一性较差的字段、更新太频繁的字段、大文本字段 上面创建索引

四、索引类型

4.1  普通索引

create index 索引名 on 表名(字段);

alter table 表名 add index 索引名(字段);

create table 表名 (.... , index 索引名(字段));

4.2  唯一索引

create unique index 索引名 on 表名(字段);

alter table 表名 add unique 索引名(字段);

create table 表名 (.... , unique 索引名(字段));

4.3  主键索引

alter table 表名 add primary key(字段);

create table 表名 (.... , primary key(字段));

4.4  多列组合索引(适用于普通索引、唯一索引、主键索引)

create index 索引名 on 表名(字段1, 字段2, 字段3, ....);

alter table 表名 add index 索引名(字段1, 字段2, 字段3, ....);

#查询语句使用 and 做逻辑运算符时,where子句的条件字段顺序要与创建多列组合索引的字段顺序一致(要满足最左执行原则)

select 字段 from 表名 where 字段1=XX and 字段2=XX and 字段3=XX ;

4.5  全文索引(只能在char、varchar、text等字符数据类型字段上创建)

create fulltext index 索引名 on 表名(字段);

alter table 表名 add fulltext 索引名(字段);

create table 表名 (.... , fulltext 索引名(字段));

#全文索引可用于做全文模糊查询

select 字段 from 表名 where match(字段) against('单词');

五、索引操作

5.1  删除索引

drop index 索引名 on 表名;

alter table 表名 drop index 索引名;

alter table 表名 drop primary key;

5.2  查看索引

show create table 表名;

show index from 表名;

show keys from 表名;

5.3  导致索引失效的几种情况

1、where子句中对字段进行null判断       

select 字段 from 表名 where 字段 is null;

2、where子句中使用不等于判断 

select 字段 from 表名 where 字段 != XX ;       
elect 字段 from 表名 where 字段 <> XX ;

3、where子句中对字段进行表达式或函数操作 

select 字段 from 表名 where 字段/2 = 10;     
select 字段 from 表名 where 函数(字段) = XX ;

 4、where子句中使用like查询并将%放在开头

select 字段 from 表名 where 字段 like '%XX';

5、where子句中字段顺序和多列组合索引的字段顺序不一致  

索引(字段2, 字段1)                                        
where 字段1=XX and 字段2=XX;

六、补充

        如果出现select查询语句执行速度慢的情况,可能原因:

1、缺少索引;

2、索引失效;

3、SQL语句语法有问题;

4、mysql配置文件参数设置得不合理;

5、数据表太大了;别的应用导致服务器负载过高;硬件性能不足

        抛开其它原因的影响,如果是索引的原因导致select执行速度慢,要先使用 explain 分析 select 语句(看key、rows、type等字段),判断这个select语句是否正确的使用了索引,再根据select语句中的where子句使用的条件字段创建相应的单列索引或多列组合索引(要满足最左执行原则),并保证select语句中避免出现上面几种导致索引失效的情况。

http://www.dtcms.com/a/109196.html

相关文章:

  • 游戏无法启动?XINPUT1_3.dll 丢失的终极解决方案
  • 国产替代新选择:CCLink IE与EtherCAT网关在制药行业的应用,配置详解
  • python之 “__init__.py” 文件
  • DeepSeek-R1 面试题汇总
  • SAP-ABAP:SAP ABAP UPDATE 语句用法详解
  • 如何像母语一样学习英语
  • VMware ESXi:企业级虚拟化平台详解
  • MySQL-- 函数(单行函数): 日期和时间函数
  • Linux内核TCP/IP协议栈中的设计模式:从面向对象到系统级软件的跨界实践
  • 数据结构——顺序表
  • 思维链(Chain-of-Thought, CoT)与强化学习区别
  • Java基础之反射的基本使用
  • linux命令-find指令
  • 卫星升空织密天网,卫星电话架起天地一体通信桥梁
  • 数据结构与算法——单链表的实现及增、插、删、查、印、毁
  • 【c++深入系列】:类与对象详解(中)
  • Golang定时任务管理(中文日志+防重复执行)
  • React 项目使用 pdf.js 及 Elasticpdf 教程
  • lvgl避坑记录
  • lodash库介绍(一个现代JavaScript实用工具库,提供模块化、性能优化和额外功能)JavaScript库(防抖、节流、函数柯里化)JS库
  • 每日一题洛谷P8664 [蓝桥杯 2018 省 A] 付账问题c++
  • 【C++】nlohmann::json 配置加载技术实践:从基础到高级应用
  • OpenLayers:如何控制Overlay的层级?
  • 如何为Linux/Android Kernel 5.4和5.15添加 fuse passthrough透传功能 ?
  • 如何通过管理系统提升团队协作效率
  • 大模型学习二:DeepSeek R1+蒸馏模型组本地部署与调用
  • css动态设置div宽高,calc函数
  • Unity中的动态合批使用整理
  • Vue中虚拟DOM创建到挂载的过程
  • Milvus 向量数据库详解:从核心概念到 Docker 部署实践