Mysql 索引

索引的目的是提高查询效率。

[En]

The purpose of index is to improve query efficiency.

一 索引分类

1、普通索引 index

加速查询

2、唯一索引

2.1、主键索引 primary key

加速查询+约束(不为空且唯一)

2.2、唯一索引 unique

加速查询+约束(唯一)

3、联合索引

— index(id,name) 联合普通索引

— primary key(id,name) 联合主键索引

— unique(id,name) 联合唯一索引

4、全文索引 fulltext

它在搜索长篇文章时效果最好。

[En]

It works best when searching for long articles.

5、空间索引 spatial

二 索引类型

当我们创建索引时,我们可以为它指定索引类型,它可以分为两类。

[En]

When we create an index, we can specify the index type for it, which can be divided into two categories.

1、hash类型

查询单条快,范围查询慢

2、btree类型 B+树

b+树,层级越多,数据量指数级增长

不同的存储引擎支持的索引类型也不一样

InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;

NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;

Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

三 创建\删除索引的语法

1、创建索引

在创建表时就添加索引 及 注意事项

create table TABLE_NAME(

id int, # 可以添加primary key

id int index, # 不可以这么添加索引,因为index是普通索引,没有约束一说,所以不能像主键索引和唯一索引那样在定义字段的时候加索引

name char(20),

age int,

email varchar(30)

primary key(id) # 也可以为主键这样添加索引

index(id) # 虽然不能在定义字段的同时添加普通索引,但是通过这种方式为字段添加普通索引

在创建表之后添加索引

create index name on TABLE_NAME(name); # 添加普通索引

create unique age on TABLE_NAME(age); # 添加唯一索引

alter table TABLE_NAME add primary key(id); # 添加主键索引,也就是给id字段增减一个主键约束

create index name on TABLE_NAME(id,name); # 添加普通联合索引

2、删除索引

drop index name on TABLE_NAME; # 删除普通索引

drop index age on TABLE_NAME; # 删除唯一索引,就和普通索引一样,不用在index前加unique就可以删除

alter table TABLE_NAME drop promary key; # 删除主键(因为它添加的时候是按照alter来增加的,那么我们也用alter来删)

四 测试索引

1、准备表
create table TABLE_NAME(
id int,
name varchar(20),
gender char(6),
email varchar(50)
);

2、创建存储过程,实现批量插入记录
delimiter $$ #声明存储过程的结束符号为$$
create procedure auto_insert1()
BEGIN
declare i int default 1;
while(i

3、查看存储过程
show create procedure auto_insert1\G

4、调用存储过程
call auto_insert1();

五 正确使用索引

1、覆盖索引

分析

select * from TABLE_NAME where id=123;

该sql命中了索引,但未覆盖索引。

利用id=123到索引的数据结构中定位到该id在硬盘中的位置,或者说再数据表中的位置。

但是我们select的字段为*,除了id以外还需要其他字段,这就意味着,我们通过索引结构取到id还不够,

还需要利用该id再去找到该id所在行的其他字段值,这是需要时间的,很明显,如果我们只select id,

就减去了这份苦恼,如下

select id from TABLE_NAME where id=123;

这条就是覆盖索引了,命中索引,且从索引的数据结构直接就取到了id在硬盘的地址,速度很快

2、联合索引

create index ne on s1(name,email);#组合索引

3、索引合并

索引合并:把多个单列索引合并使用

分析:

我们可以使用索引合并来解决综合指数可以做的所有事情,例如

[En]

We can use index merging to solve all the things that a composite index can do, such as

create index ne on s1(name,email);#组合索引

我们完全可以单独为name和email创建索引

组合索引可以命中:

select * from s1 where name=’egon’ ;

select * from s1 where name=’egon’ and email=’adf’;

索引合并可以命中:

select * from s1 where name=’egon’ ;

select * from s1 where email=’adf’;

select * from s1 where name=’egon’ and email=’adf’;

乍一看好像索引合并更好了:可以命中更多的情况,但其实要分情况去看,如果是name=’egon’ and email=’adf’,

合并索引的效率高于合并索引的效率。如果是单一条件搜索,则使用索引合并更为合理。

[En]

Then the efficiency of combined indexes is higher than that of index merging. If it is a single conditional search, it is more reasonable to use index merging.

4、添加索引遵循原则

1、最左前缀匹配原则,非常重要的原则,

create index ix_name_email on s1(name,email,)

  • 最左前缀匹配:必须按照从左到右的顺序匹配

select * from s1 where name=’egon’; #可以

select * from s1 where name=’egon’ and email=’asdf’; #可以

select * from s1 where email=’alex@oldboy.com’; #不可以

mysql会一直向右匹配直到遇到范围查询(>、

Original: https://www.cnblogs.com/ganguixu/p/15798198.html
Author: 干桂旭
Title: Mysql 索引

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507874/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL函数1(单行函数)

    单行函数 函数的理解 分类 数值函数 基本函数 PI()无参数 CETL \ CETLING()天花板函数(取比自己大的相邻的数) FLOOR()地板函数(取比自己小的相邻的数) …

    数据库 2023年5月24日
    092
  • MySQL实战45讲 9

    09 | 普通索引和唯一索引,应该怎么选择? 每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的…

    数据库 2023年5月24日
    0104
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    数据库 2023年6月14日
    071
  • Python语法糖,提升编程幸福感!!!

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨。 今天,我们来盘点一下Python中的那些语法糖。 …

    数据库 2023年6月11日
    0101
  • 常见的dos命令

    常用快捷键 alt+f4 常见的dos命令 打开CMD的方式 开始+系统+命令提示符 win+R 输入cmd打开控制台 在任意文件夹下,按住shift+鼠标右键点击 资源管理器的地…

    数据库 2023年6月11日
    092
  • 有趣的BUG之Stack Overflow

    今天遇到一个很有意思的bug,当程序开发完成后打包到服务器运行,总是会出现栈溢出异常,经过排查发现,问题出现在一个接口上,但这个接口逻辑并不复杂,除了几局逻辑代码外和打印语句之外也…

    数据库 2023年6月6日
    080
  • 2022-8-24 js

    JavaScript脚本语言,解释性 主要给HTML网页&#x…

    数据库 2023年6月14日
    079
  • python爬虫—xpath基础教程

    XPath: XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找…

    数据库 2023年6月11日
    079
  • 计算机操作系统(慕课版)思维导图

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    095
  • MySQL–用通配符进行过滤(LIKE操作符)

    1、LIKE操作符 怎样搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。利用通配符可创建比较特定数据的搜索模式。在这个例子中,如果你想找出名称…

    数据库 2023年6月16日
    077
  • 汇编实验十编写子程序

    第一题,显示字符串,8行3列显示Welcome to masm! assume cs:codedata segmentdb ‘Welcome to masm!&#821…

    数据库 2023年6月11日
    075
  • 09 子查询

    数据库关联子查询和非关联子查询 非关联子查询:数据库嵌套查询中内层查询是完全独立于外层查询的。 执行顺序: 先执行内层查询 得到内层查询的结果后带入外层,再执行外层查询 selec…

    数据库 2023年6月16日
    0107
  • SQL的多表查询

    显示内连接: select 字段列表 from 表1 [inner] join 表2 on 连接条件; (PS:方括号(“[]”)内的为可选项;) (注意:…

    数据库 2023年6月16日
    0106
  • Host-Only模式下虚拟机无法联网问题

    环境: 镜像:Linux CentOS7——————————…

    数据库 2023年6月11日
    084
  • sql_mode详解,bug修复!!!!!

    处理MySQL数据库工作中遇到关于sql_mode的情况,特学习记录一下 废话不多说直接上错误提示,哈哈哈 bug开始!!!! INSERT INTO mmb_user (open…

    数据库 2023年5月24日
    071
  • [SuperSocket2.0]SuperSocket 2.0从入门到懵逼

    SuperSocket 2.0从入门到懵逼 1 使用SuperSocket 2.0在AspNetCore项目中搭建一个Socket服务器 1.1 引入SuperSocket 2.0…

    数据库 2023年6月9日
    0132
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球