首页 > 数据库 >MySQL数据库索引

MySQL数据库索引

时间:2023-07-03 22:12:39浏览次数:67  
标签:index name 数据库 查询 索引 MySQL 唯一 主键

1. 索引

  索引是对数据库表中一列或多列的值进行排序的一种特殊的数据结构,使用索引可以快速定位到特定的数据行,而不必扫描整个表。这可以极大地提高查询性能。在MySQL中,索引可以基于一个或多个列创建。它们可以是唯一的或非唯一的。创建索引可以使用CREATE INDEX语句或在创建表时使用CREATE TABLE语句的索引选项。

2. 索引类型

  MySQL提供了多种类型的索引,包括:

  B-tree索引:B-tree索引是最常用的索引类型,它根据键值在B-tree数据结构中保存索引,并按照键值顺序进行排序。B-tree索引适用于等值查找、范围查找和排序操作。

  哈希索引:哈希索引使用哈希算法将键值映射到一个哈希表中的索引位置。哈希索引适用于等值查找,但不适用于范围查询和排序操作。

  全文索引:全文索引用于对文本数据进行全文搜索,它会对文本数据进行分词,并为每个词建立索引。全文索引适用于对大量文本进行模糊查询。

  空间索引:空间索引用于对空间数据进行查询,如地理位置数据。空间索引使用特定的数据结构来存储和查询空间数据。空间索引只能在存储引擎为MYISAM的表中创建,空间索引一般是用不到了。

  主键索引:主键索引是一种特殊的索引,用于唯一标识表中每一行的记录。主键索引可以是B-tree索引、哈希索引或者空间索引。每张表一般都会有自己的主键,mysql会在主键上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为NULL,所以                             他是 一种特殊的唯一索引。一般在建立表的时候自动选定。

  外键索引:外键索引用于表与表之间的关联查询。外键索引通常是B-tree索引。当进行表连接查询时,外键索引可以更快地定位到关联的记录,减少了查询时间。

    唯一索引:唯一索引用于保证表中某一列的值唯一。唯一索引可以是B-tree索引或哈希索引。

    组合索引:组合索引也叫复合索引,使用多个列来创建一个索引。组合索引适用于多列查询,可以提高查询性能。复合索引的使用复合最左原则。

3. 索引的特殊标识符

  在数据库中,索引的特殊标识符指的是用来标识索引类型和属性的一些关键字或标签。下面是几个常见的索引特殊标识符:

  PRIMARY KEY:用于表示主键索引。主键是一种特殊的索引,用来唯一标识表中的每一行数据。主键索引的值必须是唯一的,且不允许为空。

  UNIQUE:用于表示唯一索引。唯一索引要求索引列的值在整个表中是唯一的,不允许有重复值。在创建唯一索引时需要确保索引列的值是唯一的。

  INDEX:用于表示普通索引。普通索引是最基本的索引类型,没有特殊的要求。它可以用于加快数据库查询的速度,但不对索引列的值进行任何限制。

  FULLTEXT:用于表示全文索引。全文索引是一种用于搜索和匹配文本内容的索引类型,可以用来优化全文搜索操作。

  SPATIAL:用于表示空间索引。空间索引是一种使用在处理空间数据(如经纬度)时的索引类型,用于加快空间数据查询和分析操作。

4. 创建索引

  4.1 创建表的同时,创建索引

  create table 表名(字段名 数据类型,字段名 数据类型,index 索引名(字段名),unique 索引名(字段名),primary key(字段名));

  4.2 在已有表中添加索引

  create [unique] index 索引名 on 表名(字段名);

5. 索引操作

  操作之前,先认识key中的三种形式。

  PRI 主键约束;如果Key是PRI,  那么该列是主键的组成部分;

  UNI 唯一约束;如果Key是UNI;该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL);

  MUL 可以重复;如果Key是MUL,  那么该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。

  如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列;

  具体含义是:

  PRI => primary key

  UNI => unique key

  MUL=> multiple key

  5.1  查看索引

  1. desc 表名; --> KEY标志为:MUL 、UNI。

  2. show create table [tb];

  5.2 删除索引

  drop index 索引名 on 表名;

  alter table 表名 drop primary key; # 删除主键

6. 查询测试

  借助性能查看选项去查看索引性能

  set profiling = 1; 打开功能 (项目上线一般不打开)

  show profiles; 查看语句执行信息

  给数据库index_test表写入200万条记录。

  先创建一个表:

create table index_test (id int primary key auto_increment,name varchar(30));

  desc index_test;

  show create table index_test;

 

  使用python插入200万条记录:

import pymysql
db = pymysql.connect(user='root',password="123456",database='db01',charset='utf8')
cur = db.cursor()
sql = "insert into index_test (name) values (%s);"
exe = []
s = "wancy"
for i in range(2000000):
    name = s + str(i)
    exe.append(name)
try:
    cur.executemany(sql,exe)
    db.commit()
except:
    db.rollback()
db.close()
select * from index_test limit 10;

  6.1 不使用索引查询

  查询name=”wancy162281”的id与name。

  先执行set profiling = 1; 打开功能 (项目上线一般不打开)

  show profiles; 查看语句执行信息。

 

  查询name=”wancy162281”的记录花费了1.2秒左右。

 

  6.2 使用索引查询

  给index_test的name字段表添加索引。

create index name_index on index_test(name);

  记录数比较多。创建索引需要长一点时间。花费了49秒,不同机器时间可能不同。

 

  使用select * from index_test where name="wancy162281";查询结果如下:

 

  只花费了0.08秒左右的时间就查询出结果了。

7. 使用索引的优缺点

  优缺点

    优点 :加快数据检索速度,提高查找效率

    缺点 :占用数据库物理存储空间,当对表中数据更新时,索引需要动态维护,降低数据写入效率

  注意 :

    1. 通常我们只在经常进行查询操作的字段上创建索引

    2. 对于数据量很少的表或者经常进行写操作而不是查询操作的表不适合创建索引

 

 

小结:创建适当的索引可以极大地提高查询性能,但也要注意过多或不合理的索引可能会导致性能下降。因此,对于索引的使用需要权衡好查询频率、查询类型和数据插入/更新/删除操作的性能影响。本文并未对索引的类型做过多的详细讲解。注意本文讲解的索引是存储引擎为Innodb下的索引,不同的数据结构和类型选择取决于具体的应用场景和性能需求。另外,当给字段添加外键时,会自动创建索引,删除外键后,其索引不会主动删除。关于索引更具体的知识可以参考本文最后的链接,写的比较详细。

 

参考资料:

https://www.cnblogs.com/zhangyi555/p/15596768.html

 

若存在不足或错误之处,欢迎指正与评论!

 

标签:index,name,数据库,查询,索引,MySQL,唯一,主键
From: https://www.cnblogs.com/wancy/p/17524231.html

相关文章

  • 软测笔记6-【Mysql面试题】
    1.请列出几款典型的关系型和非关系型数据库关系型数据库:mysql、sql-server、oracle非关系型:redis、mongodb2.请列出mysql数据库的特点特点有:可移植性好、支持多操作系统、支持多语言、开源社区版本免费、支持多线程等3.Mysql中常用的数据类型有哪些?字符串型、数值型、......
  • 【mysql】一、mysql的学习---索引
    mysql的学习资料来源 https://www.bilibili.com/video/BV1CZ4y1M7MQ?from=search&seid=3518646188262100291一、索引:【mysql】一、mysql的学习---索引二、视图:【mysql】二、mysql的学习---视图三、存储过程和函数:【mysql】三、mysql的学习---存储过程和函数四、触发器:【mysq......
  • linux系统中彻底删除MySql
    一、使用以下命令查看当前安装mysql情况,查找以前是否装有mysql1rpm-qa|grep-imysql可以看到如下图的所示:   显示之前安装了:MySQL-client-5.5.25a-1.rhel5MySQL-server-5.5.25a-1.rhel5二、停止mysql服务、删除之前安装的mysql......
  • MYSQL笔记:删除操作Delete、Truncate、Drop用法比较
    1、执行速度比较Delete、Truncate、Drop关键字都可以删除数据drop>truncate>delete2、原理方面2.1deletedelete属于数据库DML操作语言,只会删除数据表中的记录,会执行事务,执行的时候也会触发触发器。InnoDB数据库引擎中,执行delete操作只会给删除的记录打上了删除标记,并不会真正删除......
  • mysql处理delete后不释放磁盘空间
    myisam:optimizetabletable_nameinnodb:altertabletable.nameengine='innodb’1.问题描述在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数......
  • DotLucene搜索索引(下)
    还有就是一个Paging属性,他的作用就是分页,输出分页的html这个属性很经典1/**////<summary>2///开始分页3///</summary>4///<returns></returns>5protectedDataTablePaging6{7get8{9//知道了startAt,分页......
  • DotLucene搜索索引(上)
    主要就两个方法,一个search()方法,主要是显示当前页的搜索记录1protectedvoidsearch()2{3DateTimestart=DateTime.Now;//搜索的开始时间4//得到索引所在的目录,我们在上个console程序里把索引放到了index目录下5stringindexDirectory=......
  • Bat批处理命令实现一键安装mysql环境
    已测试可用的版本MySQL8.0;环境:windows7/10MySQL8.0.15免安装版项目需求需要实现一个自动化MySQL配置安装及初始化数据库(初始化包括:设置用户名和密码)。批处理用来对某对象进行批量的处理,即可通过批处理让相应的软件执行自动化操作。MySQL免安装版使用步骤:1.配置环境变量2.创建MySQ......
  • mysql的update更新及delete删表记录where不带索引字段导致死锁
    为什么会发生这种的事故?InnoDB存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。因此InnoDB存储引擎自己实现了行锁,通过......
  • Jmeter学习之四_kingbaseV8R6数据库的简单验证
    Jmeter学习之四_kingbaseV8R6数据库的简单验证背景周一没去报道,因为我忘记体检了...继续在家进行学习提高自己.jmeter周末时开始看的.今天想着继续研究一下对数据库的处理突然发现人大金仓的官方csdn有一个文档,所以想着偷师,并且总结学习一下.感谢官网的资料.https......