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 主键约束;如果KeyPRI,  那么该列是主键的组成部分;

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

  MUL 可以重复;如果KeyMUL,  那么该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值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

 

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

 

posted @ 2023-07-03 22:08  wancy  阅读(83)  评论(0编辑  收藏  举报