索引(二)|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习索引(二)

开发者学堂课程【数据库核心概念:索引(二)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/63/detail/1142


索引(二)


内容介绍

一.索引的优势

二.索引的劣势

三.索引分类

四.基本语法


首先进行简单的复习:什么是索引?

索引是查找加排序两大功能,一个解决 where 后条件查询是否快速,二是 order by 排序是如何查找快速。例如做一套电信系统,按照手机号码查询如果 telephone number 字段做了排序,排好序的手机号码有11位(0到9)如果第一位为1可以根据索引而快速定位到就避免永远从0-123456789搜索直到找到数字1,而使用索引可以快速定位到。


一.索引的优势

结合索引查看索引优势与劣势:如同硬币有两面,事物同样有好坏两面,需要清晰的了解事物的两面性。

索引的优势:类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的 IO成本。上节课程中讲到的表中如果有一百万册图书,此时如果需要查找书籍那么需要从第一本依次查询,如果书籍位置靠后,这时磁盘 io 频繁百万此 io 非常恐怖。

假设建立索引(类似上节课程中 B 树结构)这时查找书籍编码是153中间值为90,比中间值大向右比它小的向左;那么90以前的被过滤了,向下查找树的高度即查找的维度,假设树最高三层那么做多才能查找三层。

通过索引列对数据进行排序(例如查找 bookname,telephone number 字段;bookname 一列一个字段,在此列上添加索引,即查找快速是因为已经排序例如英文 mysql 先定位到 m 在定位到 y 然后依次定位到 s,q,l;每一字段的查找不用全表扫描),降低数据排序的成本,降低了 CPU 的消耗。

从硬件上说一个是 io,一个是 cpu。索引优势;提高数据检索的效率,降低数据排序的成本即排好序的快速查找的数据结构,干两件事:排序和查找。


二.索引的劣势

索引的劣势:如果一张表八十个字段,对表中每一个字段都建立索引,需要八十个索引,一张表从技术理论上说可以每一个字段都建立一个索引,但这样的做法不合适;上节课程讲到左边是表右边是索引树,索引需要占用磁盘空间,好比上节课程图书馆管理员只需要使用一套图书管理系统不会每一本书都建立一套索引。第二个问题;在日常工作中是建单值索引多还是建立复合索引多?在淘宝,京东或者自己做的电商系统最上面是 form 表单进行各种条件的筛选,在查询是一般而言会使用多个条件。

索引劣势:

第一.实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录(索引类似于 Java 中等号左边的引用指向实际对象和数据),所以索引列也是要占用空间的。

第二.虽然索引大大提高了查询速度,同时却会降低更新表的速度(对数据删除影响较小),如对表进行INSERT、UPDATE和DELETE.(INSERT、UPDATE和DELETE都是一种写操作)因为更新表时,MySQL不仅要保存数据,还要保下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息即不但需要更改数据还需要改索引。

例如天龙八部从三号柜挪到七号柜数据发生物理上的变更,那么图书管理系统上索引目录的指向同样需要更改,否则索引无效。索引只是提高效率的一个因素,如果你的ySQL有大数据量的表,就需要花时间研究建立最优秀的索引(例如京东上建立索引系统,第一次只是预设一个客户可能查找的索引;后面根据点击率和客户筛选条件分析针对某物品客户喜欢使用某一字段,那么索引需要不停的优化与调整)还没回做例题,其中有个雷,做完例题会发现索引是不停的优化出来的,索引建立不是一朝一夕的,变更环境,业务等需要人为处理。


三.索引分类

(1)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。以 MySQL数据版本为例,一张表一定是建立复合索引由于单值索引,因为不可能要求在查询时只能按照单值查询,大部分需要多选。当然针对频繁使用的字段,如银行系统会按照两个字段进行单独查询一是银行卡号码二是个人身份证号码(姓名不可以,因为姓名重复的太多,)这即使复合索引。

在系统中11位手机号码可以保证不重复,不排除一人拥有两个手机号码但名字相同。二,一张表建立的索引最多不要超过五个,是一种中规中矩的建议;可以建立更多,如果查询  MySQL,在上面建立五个索引,而系统收到命令和之前的操作建立五个索引,评估后觉得可能会用到其中的二到三个索引,以目前版本为例一次只能加载一个索引。类似于一个人有多套房,但是一个晚上只能住在一套房中,不可能同时住在两套房中。

(2)唯一索引:索引列的值必须唯一,但允许有空值。假设建立一个中规中矩的普通索引,还有一种情况是 younik,加了限制条件例如银行系统中要求银行卡号是唯一的,这种索引是唯一索引;例如对 username  建立普通索引可能在系统中有多个用户重名,如果是银行卡号就不可能重复

(3)复合索引:即一个索引包含多个列


四、基本语法

(1)创建:

CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));中括号内容可以省略。

ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))

最中规中矩有两种建法:

第一种 CREATE INDEX  如果建立唯一索引在中间加关键字 UNIQUE ,indexName (索引名)

ON mytable(columnname(length))(那张表上的那个字段),如果 mytable 括号后中只有一个即单值索引,如果有多个即复合索引。第二种:ALTER mytable ADD [UNIQUE] INDEX(索引)

[indexName](索引名字) ON (columnname(length))(字段)

(2)删除:DROP INDEX [indexName](已经建立的索引名,一般为index_+表名称) ON mytable;把某张表上的某个索引删除

(3)查看 :SHOW INDEX FROM table_name\G。可以查看已经建立的索引,

例如:SHOW INDEX FROM table_emp,表中有主键:id,员工表中有部门 id 是外键。索引类型为 BTREE。本次课程立足于 Java 开发相关数据库培训,不是专用 dba培训。

image.png

这是对索引的创建,删除,查看;总结了一些公式可以使用四种方式来添加数据表的索引,即 ALTER TABLE 的使用。

ALTER TABLE tbl_name ADD PRIMARY KEY(column_list)该i语句漆加一个主键。

ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)这条语句添加唯一索引。ALTER TABLE tbl_name ADD INDEX index_name(column_list)添加普通素引。

ALTER TABLE tbl_name ADD FULLTEXT  

index_name(column_list)添加全文素引,

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1315 5
|
2天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1367 87
|
2天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
200 82
2025年阿里云域名备案流程(新手图文详细流程)