当前位置:网站首页>数据库索引的一些说明以及使用
数据库索引的一些说明以及使用
2022-07-27 05:20:00 【Dessd】
什么是索引
索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。
索引的作用:
通常加入到数据库表的一个字段中,加快查询的速度。INSERT 与 UPDATE 语句在拥有索引的表中执行会花费更多的时间,而SELECT 语句却会执行得更快。这是因为,在进行插入或更新时,数据库也需要插入或更新索引值。
索引的类型:
- UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值
- INDEX(普通索引):允许出现相同的索引内容
- PROMARY KEY(主键索引):不循序出现相同的值
- FULLTEXT INDEX(全文索引):可以针对值中的某个单词,但是一般效率比较低
- 组合索引:实质上是将多个字段建立到一个索引里,列值的组合必须唯一
索引的使用
1.CREATE创建
CREATE INDEX可用于对表增加普通索引或UNIQUE索引,可用于建表时创建索引。
CREATE INDEX index_name ON table_name(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
//create只能添加这两种索引;
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索引。
2.ALTER创建
应用于表创建完毕之后再添加。
ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引
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) ;
3.删除索引
删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下:
drop index index_name on table_name ;
alter table table_name drop index index_name ;
alter table table_name drop primary key ;
其中,在前面的两条语句中,都删除了table_name中的索引index_name。而在最后一条语句中,只在删除PRIMARY KEY索引中使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
4.组合索引
在这里要指出,组合索引和前缀索引是对建立索引技巧的一种称呼,并不是索引的类型。为了更好的表述清楚,建立一个demo表如下。
create table USER_DEMO
(
ID int not null auto_increment comment ‘主键’,
LOGIN_NAME varchar(100) not null comment ‘登录名’,
PASSWORD varchar(100) not null comment ‘密码’,
CITY varchar(30) not null comment ‘城市’,
AGE int not null comment ‘年龄’,
SEX int not null comment ‘性别(0:女 1:男)’,
primary key (ID)
);
为了进一步榨取mysql的效率,就可以考虑建立组合索引,即将LOGIN_NAME,CITY,AGE建到一个索引里:
ALTER TABLE USER_DEMO ADD INDEX name_city_age (LOGIN_NAME(16),CITY,AGE);
建表时,LOGIN_NAME长度为100,这里用16,是因为一般情况下名字的长度不会超过16,这样会加快索引查询速度,还会减少索引文件的大小,提高INSERT,UPDATE的更新速度。
如果分别给LOGIN_NAME,CITY,AGE建立单列索引,让该表有3个单列索引,查询时和组合索引的效率是大不一样的,甚至远远低于我们的组合索引。虽然此时有三个索引,但mysql只能用到其中的那个它认为似乎是最有效率的单列索引,另外两个是用不到的,也就是说还是一个全表扫描的过
LOGIN_NAME,CITY,AGE
LOGIN_NAME,CITY
LOGIN_NAME
为什么没有CITY,AGE等这样的组合索引呢?这是因为mysql组合索引“最左前缀”的结果。简单的理解就是只从最左边的开始组合,并不是只要包含这三列的查询都会用到该组合索引。也就是说name_city_age(LOGIN_NAME(16),CITY,AGE)从左到右进行索引,如果没有左前索引,mysql不会执行索引查询。
边栏推荐
- WebODM win10安装教程(亲测)
- 【头歌】重生之我在py入门实训中(7): 函数调用
- [high concurrency] interviewer
- leetcode系列(一):买卖股票
- ps 2022 六月更新,都新增了哪些功能
- 15. GPU acceleration, Minist test practice and visdom visualization
- [Haowen planting grass] knowledge of root domain name - Ruan Yifeng's Weblog
- Greedy high performance neural network and AI chip application research and training
- Digital image processing Chapter 8 - image compression
- 【头歌】重生之我在py入门实训中(5):列表
猜你喜欢
随机推荐
数字图像处理——第六章 彩色图像处理
【头歌】重生之机器学习-线性回归
Gbase 8C - SQL reference 6 SQL syntax (12)
韦东山 数码相框 项目学习(三)freetype的移植
方差与协方差
【头歌】重生之我在py入门实训中(10): Numpy
【头歌】重生之我在py入门实训中(6):函数的定义与应用
19. Up and down sampling and batchnorm
Multi task foundation of IOT operating system
【头歌】重生之我在py入门实训中(3): if条件语句
Matlab 画图(超详细)
Speech and Language Processing (3rd ed. draft) Chapter 2 ——正则表达式,文本归一化,编辑距离 阅读笔记
Weidongshan digital photo frame project learning (III) transplantation of freetype
物联网操作系统多任务基础
解决conda install 安装停止、中断问题
文件的路径
STM32-红外遥控
百问网驱动大全学习(一)LCD驱动
18. Convolutional neural network
14. Example - Multi classification problem









