数据库索引(1)

数据库索引

1.索引介绍

索引是一种 特殊的数据库结果,由数据表中的一列或多列组合而成,可以用来快速查询数据表中某一些特定值的记录。

通过索引,查询数据是不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

可以把索引必做新华字典的音序表。例如,要查‘‘库’’字,如果不使用音序,就需要从字典的400页中逐页来找,但是,如果提取拼音出来,构成音序表,就只需要从10多页的音序表中直接查找。这样就可以大大节省时间。

因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。

2.为什么要使用索引?

索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一一对应关系的有序表。

索引是MySQL中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。

3.两种方式访问数据库表的行数据:

1.顺序访问

顺序访问是在表中实行全表扫描,从头到尾逐行遍历,字到在无序的行数据中找到符合条件目标数据。

2.索引访问

索引访问是通过遍历索引来直接访问表中记录的方式。

使用这种方式的前提是对表建立一个索引,在列上创建索引后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷的查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。

例如:

在学生基本信息表tb_students中,若果基于student_id建立了索引,系统就建立了一张索引到实际记录的映射表。当用户需要查找student_id为120022的数据的时候,系统现在student_i索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。

简而言之。不使用索引,MySQL就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL就能快速的到达一个位置去收索数据文件,而不必查看所有的数据,这样将会节省很大一部分时间。

4.索引的优缺点

优点:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。

  • 可以给所有的MySQL列类型设置索引。

  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。

  • 在实现数据的参考完整性方面可以加速表与表之间的连接。

  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

缺点:

  • 创建和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引索要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快到达最大文件尺寸。
  • 当对表中的数据进行增加,删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。使用索引是,需要综合考虑索引的优点和缺点。
  • 索引可提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录是,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入有大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,让后插入数据,插入完成后,在创建索引。

数据库索引可以分为以下几类:

  • 普通索引:最基本的索引类型,没有唯一性的限制。
  • 唯一性索引:保证索引列的所有值都只能出现一次,即必须唯一。
  • 主键索引:一种特殊的唯一性索引,一个表中只能有一个主键索引。
  • 全文索引:适合进行模糊查询,如在文章中检索文本信息。
  • 组合索引:在多个列上创建的索引,可以区分其中一列可能有相同值的行。

基本语法

MySQL提供了三种创建索引的方法:

1.使用CREATE INDEX语句

可以使用create index在一个已有的表上创建索引,但该语句不能创建主键。

create 索引名 on 表名...
  • 索引名:指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。
  • 表名:要创建索引的表名。

2.使用create table语句

索引也可以在创建表的同时创建。在create table语句后添加语句:

constraint primary key [索引类型]...

在create table语句中添加以下语句,表示创建新表的同时创建该表的主键。

key | index [索引名]...

在create table语句中添加以下语句,表示在创建新表的同时创建该表的索引。

unique [index | key] [索引名]...

在create table语句中添加以下语句,表示在创建新表的同时创建该表的唯一性索引。

foreign key 索引名 列名...

在create table中添加此语句,表示在创建新表的同时创建该表的外键。

在使用create table定义列选项是,可以通过直接在某个列后面添加primary key的方式来创建主键。而当主键是有多个列组合成的多列索引时,则不能使用这种方法,只能在语句的最后加上一个primary key来实现

3.使用alter table语句

create index语句可以在一个已有的表上创建索引,alter table语句也可以在一个已有的表上创建索引。在使用alter table语句修改表的同时,可以向已有的表添加索引。具体的做法是在alter table语句中添加一下语句的某一项或几项。

add index [索引名]

在alter table语句中添加此语句,表示在修改表的同时为该表添加索引。

add primary key [索引类型]

在alter table中添加此语句,表示在修改表的同时为该表添加主键。

add unique [index | key] 索引名

在alter table语句中添加此语句,表示在修改表的同时为该表添加唯一性索引。

add foreign key[索引名]...

在alter table 中添加此语句,表示在修改表的同时为该表添加外键。

创建案例用表:
##创建member表
mysql> create table member(id int(10),name varchar(10),cardid varchar(18),phone varchar(11),address varchar(50),remark text);> desc member;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| cardid | varchar(18) | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
| remark | text | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)##插入数据
mysql> insert into member values(1,'wangyi','10010','111111','wuhan','this is vip');
Query OK, 1 row affected (0.01 sec)mysql> insert into member values(2,'wanger','10020','222222','changsha','this is vip');
Query OK, 1 row affected (0.01 sec)mysql> insert into member values(3,'wangsan','10030','333333','qingdao','this is normal');
Query OK, 1 row affected (0.01 sec)mysql> insert into member values(3,'wangsi','10040','444444','nanjing','this is normal');
Query OK, 1 row affected (0.01 sec)mysql> insert into member values(3,'wangwu','10050','555555','beijing','this is vip');
Query OK, 1 row affected (0.01 sec)mysql> select * from member;
+------+---------+--------+--------+----------+----------------+
| id   | name    | cardid | phone  | address  | remark         |
+------+---------+--------+--------+----------+----------------+
|    1 | wangyi  | 10010  | 111111 | wuhan    | this is vip    |
|    2 | wanger  | 10020  | 222222 | changsha | this is vip    |
|    3 | wangsan | 10030  | 333333 | qingdao  | this is normal |
|    3 | wangsi  | 10040  | 444444 | nanjing  | this is normal |
|    3 | wangwu  | 10050  | 555555 | beijing  | this is vip    |
+------+---------+--------+--------+----------+----------------+
5 rows in set (0.00 sec)mysql> create table member2 select * from member;
Query OK, 5 rows affected (0.03 sec)
Records: 5  Duplicates: 0  Warnings: 0mysql> select * from member2;
+------+---------+--------+--------+----------+----------------+
| id   | name    | cardid | phone  | address  | remark         |
+------+---------+--------+--------+----------+----------------+
|    1 | wangyi  | 10010  | 111111 | wuhan    | this is vip    |
|    2 | wanger  | 10020  | 222222 | changsha | this is vip    |
|    3 | wangsan | 10030  | 333333 | qingdao  | this is normal |
|    3 | wangsi  | 10040  | 444444 | nanjing  | this is normal |
|    3 | wangwu  | 10050  | 555555 | beijing  | this is vip    |
+------+---------+--------+--------+----------+----------------+
5 rows in set (0.00 sec)

5.普通索引

创建普通索引,通常使用index关键字。

案例1:直接创建

create index 索引名 on 表名...

mysql> create index phone_index on member(phone);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show create table member;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table|
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| member | CREATE TABLE `member` (`id` int DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`cardid` varchar(18) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,`remark` text,KEY `phone_index` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

案例2:修改表创建

alter table 表名 add index 索引名(列名);

mysql> alter table member add index id_index(id);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show create table member;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table|
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| member | CREATE TABLE `member` (`id` int DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`cardid` varchar(18) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,`remark` text,KEY `phone_index` (`phone`),KEY `id_index` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

案例3:创建表时指定


mysql> create table test( id int(4) not null,name varchar(10) not null ,cardid varchar(18) not null,index id_index(id));Query OK, 0 rows affected, 1 warning (0.04 sec)mysql> show create table test;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table|
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (`id` int NOT NULL,`name` varchar(10) NOT NULL,`cardid` varchar(18) NOT NULL,KEY `id_index` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

6.唯一索引

创建唯一索引,通常使用unique关键字

案例1:直接创建


mysql> create unique index address_index on member(address);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show create table member;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table|
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| member | CREATE TABLE `member` (`id` int DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`cardid` varchar(18) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,`remark` text,UNIQUE KEY `address_index` (`address`),KEY `phone_index` (`phone`),KEY `id_index` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

案例2:修改表方式创建


mysql> alter table member add unique cardid_index(cardid);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show create table member;
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table|
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| member | CREATE TABLE `member` (`id` int DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`cardid` varchar(18) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,`remark` text,UNIQUE KEY `address_index` (`address`),UNIQUE KEY `cardid_index` (`cardid`),KEY `phone_index` (`phone`),KEY `id_index` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

案例3:创建表时创建


mysql> create table test0 (id int,name varchar(20),unique id_index(id));
Query OK, 0 rows affected (0.04 sec)mysql> show create table test0;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table|
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test0 | CREATE TABLE `test0` (`id` int DEFAULT NULL,`name` varchar(20) DEFAULT NULL,UNIQUE KEY `id_index` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

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

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

相关文章

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

开篇:吴恩达《机器学习》课程及免费旁听方法

课程地址: Machine Learning | Coursera 共包含三个子课程 Supervised Machine Learning: Regression and Classification | Coursera Advanced Learning Algorithms | Coursera Unsupervised Learning, Recommenders, Reinforcement Learning | Coursera 免费…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

快手SDK接入错误处理经验总结(WebGL方案)

1、打包时提示Assets\WebGLTemplates\ks路径下未找到Index.html文件错误 处理方法:直接使用Unity默认模板下的Index.html文件即可 文件所在路径:Unity安装路径\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default 参考图&a…

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至,可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时,有时音量太小,根本没法听清楚, 遇到这种情况时,尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者:Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商, 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点,能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像,换背景色。 1,如何在Excel中抠图头像,换背景色 大家都知道在PS中可以很容易抠图头像,换背景色,其实Excel中也可以抠简单的图,换背景色。 ※所用头像图片为百度搜索&#x…

JavaScript笔记基础篇03——函数

黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 函数 函数的使用 1.函数的声明语法 2.函数的…

manim(manimgl)安装教学-win11(2024-08)

manim 目前的两种版本:★★ 稍微捋一捋【项目中的 readme.md 十分重要】 manimgl 是 Grant Sanderson(YouTube频道 3Blue1Brown的作者)等人开发。 现在为 manimgl,在维护中。 manimCE 是2020年后的 manim 分支 manim community e…

常见Arthas命令与实践

Arthas 官网:https://arthas.aliyun.com/doc/,官方文档对 Arthas 的每个命令都做出了介绍和解释,并且还有在线教程,方便学习和熟悉命令。 Arthas Idea 的 IDEA 插件。 这是一款能快速生成 Arthas命令的插件,可快速生成…

DS18B20温度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.工作原理:复位脉冲与应答脉冲 4.工作原理:写时序 5.工作原理:读时序 6.工作原理:DS18B20读取的数据格式 7.工作原理:DS18B20配置步骤 三、程序设计 ma…

Chrome远程桌面无法连接怎么解决?

Chrome远程桌面连接已停止工作 Chrome远程桌面是一款极为便捷的浏览器插件,能够帮助用户将自己的计算机连接到其他设备,无论是手机、平板电脑还是其他电脑。然而,在实际使用中,许多用户可能会面临各种各样的问题,比如…

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析: 比较规则的性能,分为light和heavy两种情况,性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶(第一条)2. 无限制(去掉了第一条…

如何实现亿级用户在线状态统计?

亿级用户在线场景分析与解决方案 目录 亿级用户在线场景分析解决方案 2.1 基于总数的统计方案2.2 基于具体用户详情的统计方案 具体实现 3.1 基于总数的统计方案3.2 基于用户标识的统计实现3.3 Spring Boot 中的实现 总结 1. 亿级用户在线场景分析 以 QQ 在线状态统计为例&am…

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈,帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作(cmp & swap) 线程控制:两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 从简单开始一步一步讲, 1、sum( )over( ) 对所有行进行求和 2、sum(…

你还在用idea吗

从VIM、Emacs,到eclipse、Jetbrains, 再到VSCode,过去的三十年时间,出现了这三代IDE产品。现在属于AI的时代来了,最新一代的产品像Cursor、Windsurf,就在昨天,字节跳动发布了最新的IDE,就叫Trae…

Unity新版InputSystem短按与长按,改键的实现

目录 前言: 一、InputSystem简介 1.安装InputSystem包 2.创建配置文件 3.创建自定义的Actions 二、自定义输入类 三、改键 四、全代码 前言: 新版inputsystem是Unity推出的一种新的输入方式,它将设备与行为进行分离,通过…

Android AutoMotive --CarService

1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统,它是基于现有Android系统的基础上增加了新特性,最主要的就是增加了CarService(汽车服务)模块。我们很容易把Android AutoMotive和Android Auto搞混&…

AWTK-WEB 快速入门(3) - C 语言 Http 应用程序

AWTK-WEB 快速入门 - C 语言 Http 应用程序 XMLHttpRequest 改变了 Web 应用程序与服务器交换数据的方式,fetch 是 XMLHttpRequest 继任者,具有更简洁的语法和更好的 Promise 集成。本文介绍一下如何使用 C 语言开发 AWTK-WEB 应用程序,并用 …