MySQL的索引学习

文章目录

  • 索引
    • 自动创建索引
    • 手动创建索引
    • 删除索引
    • 使用索引
  • 单列索引
    • PRIMARY
    • NORMAL
    • UNIQUE
    • FULLTEXT
  • 组合索引(复合索引/联合索引)
  • 索引不足之处
  • 索引使用注意事项
  • 索引方式 Hash 和 BTree 比较
  • 删除索引

索引

数据库的索引就像一本书的目录,能够加快数据库的查询速度。索引是一种用来提高查询效率的机制,索引是一种用来在数据库中加速表查询的数据库对象,通过索引值和索引的数据结构快速定位数据,可有效较少磁盘 I/O 操作,提高访问性能。

MySQL 索引有四种 PRIMARY、INDEX、UNIQUE、FULLTEXT, 其中PRIMARY、INDEX、UNIQUE 是一类,FULLTEXT 是一类。

这四种都是单列索引,也就是他们都是作用于单个列,所以称单列索引;但是一个索引也可以作用于多个列上,称为组合索引或联合索引或复合索引。

注意:创建索引的字段的值可以重复,也可以为空,但是不建议为空。

自动创建索引

如果数据表有 PK/Unique 两种约束,相关的字段会自动创建索引,除此以外,索引必须手动创建。

手动创建索引

创建表的时候定义联合索引:

mysql> CREATE TABLE `user` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `age` tinyint(1) DEFAULT NULL,`sex` tinyint(1) DEFAULT NULL, KEY `idx_name_age` (`name`,`age`)  USE BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `age` tinyint(1) DEFAULT NULL,`sex` tinyint(1) DEFAULT NULL, INDEX `idx_name_age` (`name`,`age`)  USE BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建表的时候定义单列索引:

CREATE TABLE `user` (`id` bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT,`NAME` varchar(30) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `NAME` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 |

给表添加索引:

ALTER TABLE table_name ADD INDEX index_name (column_list); -- 添加普通索引,INDEX 可以改成 KEY
ALTER TABLE table_name ADD UNIQUE index_name (column_list); -- UNIQUE KEY 或者 UNIQUE INDEX 或者 UNIQUE 都表示唯一索引
ALTER TABLE table_name ADD PRIMARY KEY index_name (column_list); -- 添加主键索引
ALTER TABLE table_name ADD KEY index_name (column_list); -- 添加普通索引

创建索引:

CREATE INDEX index_name ON table_name(column_list); -- 创建普通索引
CREATE KEY index_name ON table_name(column_list); -- 创建普通索引
CREATE UNIQUE INDEX index_name ON table_name(column_list); -- 创建唯一索引
CREATE UNIQUE KEY index_name ON table_name(column_list); -- 创建唯一索引
CREATE UNIQUE index_name ON table_name(column_list); -- 创建唯一索引

注意:索引名称和字段名称千万不要加单引号或者双引号,要么添加反引号,要么都不添加。

删除索引

alter table commodity drop index idx_spec_value;

注:删除不存在的索引会报错。

使用索引

select * from student where id = 1001; -- 字段id是主键索引,所以使用id字段查询,会使用id索引
select * from student where name = 'zhangsan'; -- 字段name没有创建索引,所以使用name查询数据,不会用到索引,而是全表扫描数据,效率低

单列索引

新建一张测试表

CREATE TABLE t_user(id       INT NOT NULL,username VARCHAR(16) NOT NULL); 

PRIMARY

主键索引。索引列唯一且不能为空;一张表只能有一个主键索引(主键索引通常在建表的时候就指定)

CREATE TABLE T_USER(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,PRIMARY KEY(ID))

NORMAL

普通索引。索引列没有任何限制。

建表时指定:

CREATE TABLE T_USER(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,INDEX USERNAME_INDEX(USERNAME(16))) # 给列USERNAME建普通索引USERNAME_INDEX

ALTER语句指定:

ALTER TABLE T_USER ADD INDEX U_INDEX (USERNAME) # 给列USERNAME建普通索引 U_INDEX

UNIQUE

唯一索引。索引列的值必须是唯一的,但允许有空。

建表时指定

CREATE TABLE t_user(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,UNIQUE U_INDEX(USERNAME)) # 给列USERNAME添加唯一索引T_USER

ALTER语句指定

ALTER TABLE t_user ADD UNIQUE u_index(USERNAME) # 给列T_USER添加唯一索引u_index

FULLTEXT

全文搜索的索引。FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。索引的新建和删除和上面一致,这里不再列举…

组合索引(复合索引/联合索引)

新建一张表:

CREATE TABLE T_USER(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,CITY VARCHAR(10),PHONE VARCHAR(10),PRIMARY KEY(ID)
);

组合索引就是把多个列加入到一个索引中,如新建的表T_USER,我们给USERNAME+CITY+PHONE创建一个组合索引

ALTER TABLE t_user ADD INDEX name_city_phone(USERNAME,CITY,PHONE);  # 组合普通索引
ALTER TABLE t_user ADD UNIQUE name_city_phone(USERNAME,CITY,PHONE); # 组合唯一索引

这样的组合索引,其实相当于分别建立了(USERANME,CITY,PHONE USERNAME,CITY USERNAME,PHONE)三个索引。

为什么没有(CITY,PHONE)索引呢?这是因为MySQL 组合查询“最左前缀”的结果。简单的理解就是只从最左边开始组合。

并不是查询语句包含这三列就会用到该组合索引:
  
这样的查询语句才会用到创建的组合索引

SELECT * FROM t_user where USERNAME="parry" and CITY="广州" and PHONE="180";
SELECT * FROM t_user where USERNAME="parry" and CITY="广州";
SELECT * FROM t_user where USERNAME="parry" and PHONE="180"; 

这样的查询语句是不会用到创建的组合索引

SELECT * FROM t_user where CITY="广州" and PHONE="180";
SELECT * FROM t_user where CITY="广州";
SELECT * FROM t_user where PHONE="180";

索引不足之处

(1)索引提高了查询的速度,但是降低了INSERT、UPDATE、DELETE的速度,因为在插入、修改、删除数据时,还要同时操作一下索引文件;

(2)建立索引文件会占用一定的磁盘空间。

索引使用注意事项

(1)只要列中包含NULL值将不会被包含在索引中,组合索引只要有一列含有NULL值,那么这一列对于组合索引就是无效的,所以我们在设计数据库的时候最好不要让字段的默认值为NULL

(2)使用短索引
如果可能应该给索引指定一个长度,例如:一个VARCHAR(255)的列,但真实储存的数据只有20位的话,在创建索引时应指定索引的长度为20,而不是默认不写。如下:

ALTER TABLE t_user add INDEX U_INDEX(USERNAME(16)) 优于 ALTER TABLE t_user add INDEX U_INDEX(USERNAME);

使用短索引不仅能够提高查询速度,而且能节省磁盘操作以及I/O操作。

(3)索引列排序
MySQL 在查询的时候只会使用一个索引,因此如果 where 子句已经使用了索引的话,那么order by中的列是不会使用索引的,所以order by尽量不要包含多个列的排序,如果非要多列排序,最好使用组合索引。

(4)Like 语句
一般情况下不是鼓励使用 like,如果非使用,那么需要注意 like '%aaa%' 不会使用索引;但 like 'aaa%' 会使用索引。

(5)不使用 NOT IN<> 操作

索引方式 Hash 和 BTree 比较

1.Hash

仅用于对等比较,如 “=” 和 " <=>",Hash 不能用于范围查询。

2.BTree
BTree 索引看名字就知道索引以树形结构存储,通常用在像“=,>,>=,<,<=、BETWEEN、Like”等操作符查询效率较高;
通过比较发现,我们常用的是 BTree 索引方式,当然 MySQL 默认就是 BTree 方式。

删除索引

DROP INDEX U_INDEX ON t_user;  # 删除表t_user中的索引U_INDEX

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

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

相关文章

aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?

LDAC技术的功能介绍LDAC是索尼研发的一种无线音频编码技术&#xff0c;它最早在2015年的CES消费电子设备大展上亮相。在当时&#xff0c;索尼表示比起标准的蓝牙编码、压缩系统&#xff0c;LDAC技术要高效三倍之多。这样一来&#xff0c;那些高解析度的音频文件在进行无线传输的…

【音视频安卓开发 (九)】使用AudioRecord录制PCM音频

1.需要添加权限 <uses-permission android:name"android.permission.CAMERA" /><uses-permission android:name"android.permission.FLASHLIGHT" /><uses-permission android:name"android.permission.CAMERA" /><uses-per…

结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德

结果集 tostring使用Java或我使用过的其他编程语言&#xff0c;我发现有时候可以用该语言完成某些事情&#xff0c;但通常不应该这样做。 通常&#xff0c;这些误用语言似乎无害&#xff0c;当开发人员首次使用它们时可能是有益的&#xff0c;但后来同一位开发人员或另一位开发…

3制造数据集_基于MBD的产品设计制造技术研究

本篇节选自论文《基于MBD的产品设计制造技术研究》&#xff0c;发表于《中国电子科学研究院学报》第8卷第6期&#xff0c;作者为中国电子科技集团公司第14研究所专家朱建军。本文经授权转载自公众号学术plus&#xff0c;版权归原作者所有。作者&#xff1a;中国电子科技集团公司…

JSP文件如何转换成Java文件?

文章目录jsp 文件如何转换成 java 文件jsp 何时开始编译jsp 编译后的文件存储目录jsp 文件如何转换成 java 文件 html ----> service(),使用 out.write()输出。 java代码片段 <% %> ----> service(),照…

【WebRTC---源码篇】(九)媒体协商

1.媒体协商的过程 2. 重要的接口类 3.时序图 4.几个关键点 5.code if (InitializePeerConnection()) {peer_id_ = peer_id;//参数1:观察者,创建成功后回调OnSuccess//参数2:消息类型,自动推导peer_connection_->CreateOffer(this, webrtc::PeerConnectionInterface::RTCOff…

jpa 使用jdbc_在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ

jpa 使用jdbcJava杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章&#xff1a; http : //www.javamagazine.mozaicreader.com/MayJune2016 本文介绍了如何在JDBC中使用存储过程&#xff08;不幸的是&#xff0c;请注意如何关闭资源。即使在Java Magazi…

JSP文件中Java代码的几种形式(JSP脚本)

文章目录第一种形式&#xff08;Java 代码片段&#xff09;第二种形式&#xff08;JSP 表达式&#xff09;第三种形式&#xff08;JSP 声明&#xff09;第四种形式&#xff08;JSP 指令&#xff09;第一种形式&#xff08;Java 代码片段&#xff09; 原样复制到 service() 方法…

【WebRTC---源码篇】(七)NACK的处理流程

NACK调用栈 从分发器接收Packet包 void RtpVideoStreamReceiver::ReceivePacket(const RtpPacketReceived& packet) {if (packet.payload_size() == 0) {// Padding or keep-alive packet.// TODO(nisse): Could drop empty packets earlier, but need to figure out how…

java实现资源监视器_实现Java监视的12个步骤程序存在缺陷

java实现资源监视器Java监视的当前状态最大的问题是什么&#xff1f; 生产中的错误很像喝醉的短信。 您只有在事情已经发生之后才意识到出了点问题。 发短信日志通常比应用程序错误日志更有趣&#xff0c;但是……两者可能同样难以修复。 在本文中&#xff0c;我们将执行一个…

QT之QML布局相关总结

使用QML有助于提高界面编写效率&#xff0c;对付界面开发来说&#xff0c;页面如何布局是一个绕不开的点&#xff0c;本文总结一下QML中常用的一些和布局相关的内容。 目录 1.手动定位 2.坐标绑定定位 3.锚定位 4.布局定位器 5.布局管理器 6.其他布局相关 6.1 弹簧功能…

bpmn2 vue 设计器_vue项目中使用bpmn-基础篇

后退前进下载style"display: inline-block;":file-list"fileList"class"upload-demo"action"":auto-upload"false":show-file-list"false":http-request"httpRequest":on-change"handleOnchangeFi…

JSP的隐含对象/隐藏对象/内置对象介绍

文章目录outJspWriter 和 PrintWriter 的区别requestresponsesessionapplicationexceptionconfigpageContextpageContext 的作用绑订数据获得其它几个隐含对象page四个 JSP 域对象访问范围比较out out 对象是 javax.servlet.jsp.JspWriter 类的实例&#xff0c;用来在 respons…

hystrix应用 博客_使用Hystrix DSL创建弹性骆驼应用程序

hystrix应用 博客Apache Camel是一个成熟的集成库&#xff08;到现在已有9年的历史了&#xff09;&#xff0c;它实现了Enterprise Integration Patterns一书中的所有模式。 但是Camel不仅是EIP实现库&#xff0c;它还是一个不断发展&#xff0c;添加新模式并适应行业变化的现代…

notebook打开外部文件_CAD外部参照真是个好东西!

好课推荐&#xff1a;零基础CAD&#xff1a;点我CAD室内&#xff1a;点我 周站长CAD&#xff1a;点我CAD机械&#xff1a;点我 Bim教程&#xff1a;点我CAD建筑&#xff1a;点我CAD三维&#xff1a;点我全屋定制&#xff1a;点我 ps教程&#xff1a;点我苹果版CAD:点我 3dmax教…

JSP动作元素/活动元素

文章目录jsp:forwardjsp:includejsp:paramjsp:useBeanjsp:setPropertyjsp:setProperty name"" property"" value""jsp:setProperty name"" property"" param""jsp:setProperty name"" property"*&…

【数论系列】任意角的三角函数

角度转为弧度 import math math.radians(x) 弧度转为角度 import math math.degrees(x) 正弦函数 import math math.sin(弧度) 余弦函数 import math math.cos(弧度) 正切函数 import math math.tan(弧度)

gradle groovy_适用于Java开发人员的Groovy吗? 认识Gradle,Grails和Spock

gradle groovyJava开发人员最感兴趣的Groovy用例有哪些&#xff1f; 尽管已经有一段时间了&#xff0c;但似乎只有Groovy最近才开始使用Groove。 对于某些人来说&#xff0c;它基本上只是另一种深奥的JVM语言&#xff0c;但是由于一些流行的工具可以帮助您使用Java&#xff0c…

JSP 指令元素

文章目录page 指令import 属性pageEncoding 属性contentType 属性session 属性isELIgnored 属性errorPage 属性isErrorPage 属性include 指令file 属性taglib 指令uri 属性prefix 属性jsp 源文件转换成对应的 .java 文件时&#xff0c;jsp 的指令会影响 Java 源代码的生成&…

Python日常工具 ----- 读取Excel表格下载MP3

import xlrd import os import requestsdef GetList():worksheet xlrd.open_workbook(01.xlsx)sheet_names worksheet.sheet_names()print(sheet_names)for sheet_name in sheet_names:sheet worksheet.sheet_by_name(sheet_name)rows sheet.nrows # 获取行数cols sheet.…