创建与删除索引

创建与删除索引

 

索引是加速查询的主要手段,特别对于涉及多个表的查询更是如此。本节中,将介绍索引的作用、特点,以及创建和删除索引的语法。
13.4.1  使用索引优化查询
索引是高速定位数据的技术,首先通过一个演示样例来了解其含义及作用,具体的介绍请參考第14章。
1.索引演示样例
如果对于10.3节所建的表,各个表上都没有索引,数据的排列也没有规律,如表13.3所看到的。
表13.3                                                     没有索引的students表
sid
sname
sgender
sage
52
zhang
M
21
22
wang
M
22
33
li
F
19
41
zhao
M
20
 
 
当查找某个学生信息时,必须顺序查看表students中的每一行,检查是否与所需值匹配,这须要扫描全表,效率非常低。
表13.4给出了在name列上添加�了索引的students表。
表13.4                                        在name列上添加�了索引的students表
<span>创建与删除索引</span>
 
索引是在
name
上排序的。如今,当查找某个学生信息时,就不须要逐行搜索全表,能够利用索引进行有序查找(如二分查找法),并高速定位到匹配的值,以节省大量搜索时间。
2.索引作用
在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的高速定位技术,可以大大提高查询效率。特别是当数据量很大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。
比如,有3个未索引的表t1、t2、t3,分别仅仅包括列c1、c2、c3,每一个表分别含有1000行数据组成,指为1~1000的数值,查找相应值相等行的查询例如以下所看到的。
 
SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
此查询结果应该为1000行,每行包括3个相等的值。在无索引的情况下处理此查询,必须寻找3个表全部的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会很慢。
假设对每一个表进行索引,就能极大地加速查询进程。利用索引的查询处理例如以下。
(1)从表t1中选择第一行,查看此行所包括的数据。
(2)
使用表
t2
上的索引,直接定位
t2
中与
t1
的值匹配的行。相似,利用表
t3
上的索引,直接定位t3中与来自t1的值匹配的行。
(3)扫描表t1的下一行并反复前面的过程,直到遍历t1中全部的行。
在此情形下,仍然对表t1运行了一个全然扫描,但可以在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。
利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在运行连接时加快了与其它表中的行匹配的速度。
13.4.2  创建索引
在运行CREATE TABLE语句时能够创建索引,也能够单独用CREATE INDEX或ALTER TABLE来为表添加�索引。
1.ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
 
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
 
当中
table_name
是要添加�索引的表名,
column_list
指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名
index_name
可选,缺省时,
MySQL
将依据第一个索引列赋一个名称。另外,
ALTER TABLE
同意在单个语句中更改多个表,因此能够在同一时候创建多个索引。
2.CREATE INDEX
CREATE INDEX可对表添加�普通索引或UNIQUE索引。
 
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
 
table_name、index_name和column_list具有与ALTER TABLE语句中同样的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
3.索引类型
在创建索引时,能够规定索引是否能包括反复值。假设不包括,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包括反复的值。对于多列惟一性索引,保证多个值的组合不反复。
PRIMARY KEY索引和UNIQUE索引很相似。其实,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表仅仅能包括一个PRIMARY KEY,由于一个表中不可能具有两个同名的索引。
以下的SQL语句对students表在sid上加入�PRIMARY KEY索引。
 
ALTER TABLE students ADD PRIMARY KEY (sid)
 
13.4.3  删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引。相似于CREATE INDEX语句,DROP INDEX能够在ALTER TABLE内部作为一条语句处理,语法例如以下。
 
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
 
当中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句仅仅在删除PRIMARY KEY索引时使用,由于一个表仅仅可能有一个PRIMARY KEY索引,因此不须要指定索引名。假设没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
假设从表中删除了某列,则索引会受到影响。对于多列组合的索引,假设删除当中的某列,则该列也会从索引中删除。假设删除组成索引的全部列,则整个索引将被删除。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119234.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月13日 下午10:00
下一篇 2021年11月13日 下午10:00


相关推荐

  • DOS命令copy con的用

    DOS命令copy con的用copy是复制命令con 是dos 设备文件的简称。 在dos中把很多外部设备作为文件,称为设备文件。dos中这样规定的:con 控制台(键盘/显示器) aux (或com1)第一个串口 lpt1 第一个并行打印机接口,nul 不存在的设备 所以,举例说明: copy con abc

    2022年7月18日
    18
  • 域名解析 dns_一区新增风险区

    域名解析 dns_一区新增风险区1、DNSDNS(DomainNameSystem)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于TCP/IP网络。2、域名系统DNS的作用通常我们有两种方式识别主机:通过主机名或者IP地址。人们喜欢便于记忆的主机名表示,而路由器则喜欢定长的、有着层次结构的IP地址。为了满足这些不同的偏好,我们就需要一种能够进行主机名到IP地址转换的目录服务,域名系统作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。因此,即使不使用域名

    2025年6月12日
    6
  • 弹性盒子flex布局

    弹性盒子flex布局今天打开我的 csdn 竟然涨了 7 个粉丝 哈哈 为了我新涨的粉丝们 决定今晚加更一篇文章 一 flex 弹性布局与传统布局的区别 flex 弹性布局 传统布局 兼容 IE11 较好 布局效果 简单方便 繁琐 使用场景 移动端 PC 端 二 flex 布局介绍原理 通过给父盒子添加 display flex 属性 来控制子盒子的位置和排列方式 特点 待补充 1 flex 布局相较于传统布局 浮动 定位 更简便 但兼

    2026年3月19日
    3
  • 生成式引擎优化(GEO)是什么?2026年核心原理与实施策略全解析

    生成式引擎优化(GEO)是什么?2026年核心原理与实施策略全解析

    2026年3月14日
    3
  • axisfault faultcode_转付证明怎么写

    axisfault faultcode_转付证明怎么写2007-06-26关于AxisFault的说明一般说来,不可避免的WebService的服务中也会出现异常,举个简单的例子,一个服务接受一个SOAP请求消息,获取有效负载后,进行一个数据库更新操作,而在更新操作过程中发生了SQLException,这个时候就需要告诉客户端(调用WebService)出现异常了,Axis2将异常封装成为一个AxisFault进行抛出。任何类型的…

    2025年11月8日
    5
  • android开发笔记之SwipeRefreshLayout

    android开发笔记之SwipeRefreshLayoutSwipeRefreshLayout简介SwipeRefrshLayout是Google官方更新的一个控件,可以实现下拉刷新的效果,该控件集成自ViewGroup在support-v4兼容包下.在android源码中,主要是在联系人界面刷新联系人数据:packages/apps/Contacts/src/com/android/contacts/list/DefaultContactBrow…

    2022年6月25日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号