首页 > 数据库 >MySQL-索引

MySQL-索引

时间:2023-05-17 22:33:13浏览次数:46  
标签:INDEX 创建 列名 MySQL 列上 索引 表名

索引原理

索引是对数据库表中一列或多列的值进行排序的一种结构 索引被用来快速找出在一个列上用一特定值的行。 没有索引,MySQL 不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。 对于一个有序字段,可以运用二分查找(Binary Search),这就是为什么性能能得到本质上的提高。 MYISAM 和 INNODB 都是用 B+Tree 作为索引结构 简单类比一下,数据库如同书籍,索引如同书籍目录,假如我们需要从书籍查找与 xx 相关的内容,我们可以直接从目录中查找,定位到 xx 内容所在页面,如果目录中没有 xx 相关字符或者没有设置目录(索引),那只能逐字逐页阅读文本查找,效率可想而知。

索引的分类

实际工作使用中,索引可以建立在单一列上,称为单列索引,也可以建立在多个列上,称为组合索引

1、普通索引

这是最基本的索引,它没有任何限制。

2、唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

3、主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

4、聚簇索引

聚簇索引的索引顺序就是数据存储的物理存储顺序,这样能保证索引值相近的元组所存储的物理位置也相近。

5、全文索引(FULLTEXT)

全文索引只能创建在数据类型为VARCHAR或TEXT的列上,建立全文索引后,能够在建立了全文索引的列上进行全文查找。全文索引只能在MyISAM存储引擎的表中创建。

索引的应用

创建索引

应该创建索引的列

  • 在经常需要搜索的列上,可以加快搜索的速度
  • 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
  • 在经常用在连接(JOIN)的列上,这些列主要是一外键,可以加快连接的速度
  • 在经常需要根据范围(<,<=,=,>,>=,BETWEEN,IN)进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
  • 在经常需要排序(order by)的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
  • 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

不该创建索引的列

  • 对于那些在查询中很少使用或者参考的列不应该创建索引。
    若列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  • 对于那些只有很少数据值或者重复值多的列也不应该增加索引。
    这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
  • 对于那些定义为text, image和bit数据类型的列不应该增加索引。
    这些列的数据量要么相当大,要么取值很少。
  • 当该列修改性能要求远远高于检索性能时,不应该创建索引。(修改性能和检索性能是互相矛盾的)

使用alter table 创建索引

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

使用create index 创建索引

-- 创建普通索引 
CREATE INDEX 索引名 ON 表名(列名);

-- 创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);

-- 创建普通组合索引
CREATE INDEX 索引名 ON 表名(列名1,列名2);

-- 创建唯一组合索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名1,列名2);

查看索引

SHOW {INDEX | INDEXES | KEYS} {FROM | IN } 表名;

Table:指明索引所在表的名称。

Non_unique:该索引是否不是唯一性索引。如果不是值为1,如果是值为0。

Key_name:索引的名称。

Column_name:建立索引的列名称。

Collation:说明以何种顺序(升序或降序)索引。升序是A,如果值是NULL,则表示无分类。

删除索引

#-- 直接删除索引
DROP INDEX 索引名 ON 表名;

#-- 修改表结构删除索引
ALTER TABLE 表名 DROP INDEX 索引名;

 

标签:INDEX,创建,列名,MySQL,列上,索引,表名
From: https://www.cnblogs.com/lwj0126/p/17410189.html

相关文章

  • MySQL中的索引
    MySQL中常见的索引InnoDB存储引擎支持以下几种常见的索引:B+树索引、全文索引、哈希索引,其中比较关键的是B+树索引。一、B+树索引InnoDB中的索引按照B+树来组织的,数据都存放在B+树(为了快速检索数据而提出的一种数据结构)的叶子节点中。聚集索引/聚簇索引InnoDB中使用了聚集索引,就是将......
  • Python 连接 MySQL 数据库
    在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为Pandasdataframe对象进行进一步处理。而MySQL数据库是最常用的关系型数据库之一,因此在Python中如何连接MySQL数据库并查询数据成为了一个重要的问题。本文将介绍两种方法来连接MySQL数据库,并将......
  • 2022-2023年大二上mysql学习汇总
    CRUD等操作(DDL、DML、DQL)权限操作:createuser用户名@"localhost或%" identifiedby'密码'  showgrantsfor用户名@主机名 grant权限列表(all/insert/delete/select等)on库名(*).表名(*)to用户名@主机名  remove与授予一样函数:内置(后面加as......
  • PHP+MySql+jQuery实现的“顶”和“踩”投票功能
    当我们浏览网页时,我们想对网页内容如文章、评论中的观点持赞同或反对意见时,可以通过点击网页中的“顶”和“踩”来进行投票。而整个交互过程,开发者可以通过ajax异步来实现,从而提高用户体验。 本文结合实例,讲解使用PHP+MySql+jQuery实现的“顶”和“踩”投票功能,通过记录用户IP,判断......
  • Scrapy将数据存入excel和MySQL数据库中
    一:Scrapy将爬到的数据存入MySQL数据库中1.导入pymysql第三方库pipinstallpymysql2.连接数据库(itempipeline.py)实现数据库的连接一般分为三个步骤:建立连接,操作数据,提交事务,关闭数据库。基本方法如下:classSpider01Pipeline:#连接数据库def__init__(self):......
  • MySQL远程登录的设置
    ​MySQL远程登录的设置在云平台上安装了MySQLdocker环境后,需要进行远程登录的设置。MySQL镜像为8.0(8.0以下的设置有一些区别),数据库用户为root。mysql-uroot-p(输入初始密码登录123456)#createuserroot@'%'identifiedby'cloudSpring091845@#';updateusersethost......
  • MySQL远程登录的设置
    ​MySQL远程登录的设置在云平台上安装了MySQLdocker环境后,需要进行远程登录的设置。MySQL镜像为8.0(8.0以下的设置有一些区别),数据库用户为root。mysql-uroot-p(输入初始密码登录123456)#createuserroot@'%'identifiedby'cloudSpring091845@#';updateusersethost......
  • blog-博客美化-生成目录索引
    博客美化-生成目录索引注意:需要先申请开通JS接口!!今天帮朋友设置后台代码,发现怎么都没有效果,看了下忽略了JS接口;因为插入的代码大多有JS功能,不申请开通JS功能自然无法支持JS效果。网上看了很多博客也都没提及这点,感觉是个坑,So,需要的朋友可以留意下。对了、在编辑页面是显示不出......
  • mysql只有frm和ibd文件下如何恢复(表引擎为innodb)
    环境:OS:Centos7DB:mysql5.6说明:主库已经无法启动,表的引擎为innodb下面操作是在新服务器安装与原库同版本的db下进行 ###################已知表结构的情况######################1.创建同结构的表CREATETABLE`ad`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`......
  • Mysql--数据的导入导出以及备份
    一、导入导出1.1、intooutfile(只导出数据)注意:mysql5.7+版本,secure_file_priv的值默认为NULL,即不允许导入或导出,需在/etc/my.cnf添加  secure_file_priv='' 或者  secure_file_priv='指定目录'  ,重启mysql1.1.1导出select*fromtable_nameintooutfile'f......