目录
普通索引" >普通索引
唯一索引" >唯一索引
主键索引" >主键索引
复合索引" >复合索引
首页 数据库 mysql教程 mysql index是什么意思

mysql index是什么意思

Apr 13, 2023 pm 04:13 PM
mysql

在mysql中,index是指“索引”,是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列;否则,数据库系统将读取每条记录的所有信息进行匹配。因此使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。

mysql index是什么意思

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

在mysql中,index是指“索引”,是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。

通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。

因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。

为什么要使用索引

索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。

索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

1) 顺序访问

顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。

顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2) 索引访问

索引访问是通过遍历索引来直接访问表中记录行的方式。

使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。

例如,在学生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系统就建立了一张索引列到实际记录的映射表。当用户需要查找 student_id 为 12022 的数据的时候,系统先在 student_id 索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。

简而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。

索引的优缺点

索引有其明显的优势,也有其不可避免的缺点。

优点

索引的优点如下:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。

  • 可以给所有的 MySQL 列类型设置索引。

  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。

  • 在实现数据的参考完整性方面可以加速表与表之间的连接。

  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

缺点

增加索引也有许多不利的方面,主要如下:

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

使用索引时,需要综合考虑索引的优点和缺点。

索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。

索引设计原则

1)要注意,索引也是要占用磁盘空间的,所以并不是越多越好。

2)过多的索引会影响INSERT,DELETE,UPDATE等语句的执行效率。

3)数据过少不建议建立索引。

4)对于唯一性约束,应使用对应的唯一性索引。

5)尽量不对区分度低的字段建立索引。例如:枚举类型的性别字段只有男女,起不到优化效果。

6)建议在创建表的时候创建索引。若表中有大量记录,那么将列建为索引后,表中所有记录都将会修改。

7)不经常查询的字段,不建议创建索引。

索引类型

类型 作用
普通索引 基本索引方式,无特别说明
唯一性索引 数据唯一,允许有null
主键索引 表中只有一个主键,数据唯一,不允许有null
复合索引 可以包含两个或多个列的索引方式

根据不同的环境选择对应的索引类型即可。

创建索引语法

以普通索引为例,在创建表的时候创建索引

create table 表名(
 字段定义…
 index 索引名称(字段));
登录后复制

以普通索引为例,将表修改为索引

alter table 表名 add index 索引名称(字段);
登录后复制

可以使用key代替index,并且索引名称可以省略,不加索引名默认以字段名作为索引名。

普通索引

没啥要注意的,最基础的索引方式。

创建一个表,并且建立普通索引,索引列为id

mysql> create table test1(id int,name varchar(5),age tinyint,index index_id(id));
登录后复制

查看表结构,在key下的MUL就代表着普通索引

mysql> desc test1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  | MUL | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| age   | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
登录后复制

查看索引信息

mysql> show index from test1\G
*************************** 1. row ***************************
        Table: test1
   Non_unique: 1
     Key_name: index_id		
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)
登录后复制

往表中添加一些数据,用于测试

mysql> insert into test1 values(1,'张三',21),(2,'李四',22),(3,'王五',23),(4,'赵六',24);
登录后复制

通过explain模拟执行sql查询语句,先不通过索引,查询姓名为赵六的记录。

mysql> explain select * from test1 where name='赵六'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
     filtered: 25.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
登录后复制

type:ALL项表示全表扫描,rows: 4表示行数。因为赵六是表中最后一条记录,所以查询遍历了整张表。

接下来通过索引列id对姓名为赵六的字段进行查询。

mysql> explain select * from test1 where id=4\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
   partitions: NULL
         type: ref
possible_keys: index_id
          key: index_id
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
登录后复制

rows: 1表示只检索了一行便将记录查找出来了,高下立判。

唯一索引

在唯一索引中,索引列中数据唯一,不能出现重复的值,用来约束内容,允许有null值。

语法:

create table 表名(
 字段定义…
 unique key 索引名(字段名));
登录后复制

唯一索引常用在值不能重复的字段,身份证号,手机号等等。

创建一个表,并且建立唯一性索引,索引列为手机号。

mysql> create table test2(id int,name varchar(5),phone int,unique key unique_key_phone(phone));
登录后复制

查看表结构,key下为UNI的表示为唯一性索引

mysql> desc test2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  |     | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| phone | int(11)    | YES  | UNI | NULL    |       |
+-------+------------+------+-----+---------+-------+
登录后复制

插入数据,并测试特性

mysql> insert into test2 values(1,'张三',1111111111);
mysql> insert into test2 values(2,'李四',null);	#可以为null
mysql> insert into test2 values(3,'王五',1111111111);	#值必须唯一
ERROR 1062 (23000): Duplicate entry '1111111111' for key 'unique_key_phone'
登录后复制

查看表数据

mysql> select * from test2;
+------+--------+------------+
| id   | name   | phone      |
+------+--------+------------+
|    2 | 李四   |       NULL |
|    1 | 张三   | 1111111111 |
+------+--------+------------+
登录后复制

主键索引

主键索引也就是设置主键,每个表最多只能有一个主键。主键列值必须唯一,并且不允许有空值。

语法:
create table 表名(字段 primary key);

或者

create table 表名(
字段定义…
primary key 索引名称(字段));

创建一个表,并且设置为主键索引,索引列为id

mysql> create table test3(id int primary key,name varchar(5),age tinyint);
登录后复制

查看表结构,key下为PRI的为主键索引列

mysql> desc test3;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| age   | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
登录后复制

插入数据,并测试特性

mysql> insert into test3 values(1,'张三',23);
mysql> insert into test3 values(null,'张三',23);	#不能为null
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into test3 values(1,'张三',23);	#值不能重复
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
登录后复制

查看表数据

mysql> select * from test3;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   23 |
+----+--------+------+
登录后复制

复合索引

复合索引可以包含两个或多个列。

没有特定语法,可以为表创建双索引

创建一个表,并设置为复合主键,索引列为id,name

mysql> create table test4 (id int,name varchar(5),age tinyint,primary key(id,name));
登录后复制

复合主键特性和主键有些不同,只需要有一个字段不重复即可。

mysql> insert into test4 values(1,'张三',21);
mysql> insert into test4 values(1,'李四',21);
mysql> insert into test4 values(1,'张三',21);	#主键列全重复
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
登录后复制

查看表数据

mysql> select * from test4;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   21 |
|  1 | 李四   |   21 |
+----+--------+------+
登录后复制

【相关推荐:mysql视频教程

以上是mysql index是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

navicat premium怎么创建 navicat premium怎么创建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 创建数据库:连接到数据库服务器并输入连接参数。右键单击服务器并选择“创建数据库”。输入新数据库的名称和指定字符集和排序规则。连接到新数据库并在“对象浏览器”中创建表。右键单击表并选择“插入数据”来插入数据。

navicat怎么新建连接mysql navicat怎么新建连接mysql Apr 09, 2025 am 07:21 AM

可在 Navicat 中通过以下步骤新建 MySQL 连接:打开应用程序并选择“新建连接”(Ctrl N)。选择“MySQL”作为连接类型。输入主机名/IP 地址、端口、用户名和密码。(可选)配置高级选项。保存连接并输入连接名称。

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

MySQL和SQL:开发人员的基本技能 MySQL和SQL:开发人员的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

SQL删除行后如何恢复数据 SQL删除行后如何恢复数据 Apr 09, 2025 pm 12:21 PM

直接从数据库中恢复被删除的行通常是不可能的,除非有备份或事务回滚机制。关键点:事务回滚:在事务未提交前执行ROLLBACK可恢复数据。备份:定期备份数据库可用于快速恢复数据。数据库快照:可创建数据库只读副本,在数据误删后恢复数据。慎用DELETE语句:仔细检查条件,避免误删数据。使用WHERE子句:明确指定要删除的数据。使用测试环境:在执行DELETE操作前进行测试。

See all articles