千家信息网

Mysql索引概述(用于个人学习与回顾)

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Mysql索引概述索引介绍索引是对记录集的多个字段进行排序的方法。类似于书的目录索引类型包括:Btree,B+tree,hash索引优缺点索引优点-通过创建唯一性索引,可以保证数据库中每一行数据的唯一
千家信息网最后更新 2026年11月01日Mysql索引概述(用于个人学习与回顾)

Mysql索引概述


索引介绍

  • 索引是对记录集的多个字段进行排序的方法。

  • 类似于书的目录

  • 索引类型包括:Btree,B+tree,hash


索引优缺点

  • 索引优点

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

    -可以加快数据的检索速度

  • 索引缺点

    -当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,降低数据的维护速度

    -索引需要占物理空间



MySQL键值类型


键值类型

  • INDEX:普通索引

  • UNIQUE: 唯一索引

  • FULLTEXT: 全文索引

  • PRIMARY KEY: 主键

  • POREIGN KEY: 外键


INDEX普通索引

  • 使用说明

    -一个表中可以有多个INDEX字段

    -字段的值允许有重复,且可以赋予NULL值

    -经常把做查询条件的字段设置为INDEX字段

    -INDEX字段的key标志位MUL

  • 建表指定索引字段

    -index(字段1),index(字段2)...

mysql> create table test1(    -> id char(6) not null,    -> name varchar(4) not null,    -> age int(3) not null,    -> gender enum('male','female'),    -> index(id),index(name)    -> );Query OK, 0 rows affected (0.06 sec)mysql> desc test1;+--------+-----------------------+------+-----+---------+-------+| Field  | Type                  | Null | Key | Default | Extra |+--------+-----------------------+------+-----+---------+-------+| id     | char(6)               | NO   | MUL | NULL    |       || name   | varchar(4)            | NO   | MUL | NULL    |       || age    | int(3)                | NO   |     | NULL    |       || gender | enum('male','female') | YES  |     | NULL    |       |+--------+-----------------------+------+-----+---------+-------+4 rows in set (0.00 sec)
  • 在已有的表中设置index字段

    -create index 索引名 on表名(字段名);

mysql> create index age on test1(age);Query OK, 0 rows affected (0.02 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test1;+--------+-----------------------+------+-----+---------+-------+| Field  | Type                  | Null | Key | Default | Extra |+--------+-----------------------+------+-----+---------+-------+| id     | char(6)               | NO   | MUL | NULL    |       || name   | varchar(4)            | NO   |     | NULL    |       || age    | int(3)                | NO   | MUL | NULL    |       || gender | enum('male','female') | YES  |     | NULL    |       |+--------+-----------------------+------+-----+---------+-------+4 rows in set (0.00 sec)
  • 删除指定表的索引字段

    -drop index 索引名 on 表名;

mysql> drop index name on test1;Query OK, 0 rows affected (0.34 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test1;+--------+-----------------------+------+-----+---------+-------+| Field  | Type                  | Null | Key | Default | Extra |+--------+-----------------------+------+-----+---------+-------+| id     | char(6)               | NO   | MUL | NULL    |       || name   | varchar(4)            | NO   |     | NULL    |       || age    | int(3)                | NO   |     | NULL    |       || gender | enum('male','female') | YES  |     | NULL    |       |+--------+-----------------------+------+-----+---------+-------+4 rows in set (0.00 sec)
  • 查看表的索引信息

    -show index from 表名;

mysql> show index from test1\G;*************************** 1. row ***************************        Table: test1   Non_unique: 1     Key_name: id Seq_in_index: 1  Column_name: id    Collation: A  Cardinality: 0     Sub_part: NULL       Packed: NULL         Null:    Index_type: BTREE      Comment: Index_comment: *************************** 2. row ***************************        Table: test1   Non_unique: 1     Key_name: age Seq_in_index: 1  Column_name: age    Collation: A  Cardinality: 0     Sub_part: NULL       Packed: NULL         Null:    Index_type: BTREE      Comment: Index_comment: 2 rows in set (0.00 sec)


primary key主键

  • 基本概念

    -一个表中只能有一个primary key 字段

    -对应的字段值不允许有重复,且不允许赋NULL值

    -如果有多个字段都作为primary key,称为复合主键,必须一起创建

    -主键字段的KEY标志是PRI

    -通常与AUTO_INCREMENT 连用

    -经常把表中能够唯一标识记录的字段设置为主键字段【记录编号字段】

  • 建表的时候指定主键字段

    -primary key(字段名)

mysql> create table test2(    -> id int(3) auto_increment,    -> name varchar(4) not null,    -> age int(2) not null,    -> primary key(id)    -> );Query OK, 0 rows affected (0.05 sec)mysql> desc test2;+-------+------------+------+-----+---------+----------------+| Field | Type       | Null | Key | Default | Extra          |+-------+------------+------+-----+---------+----------------+| id    | int(3)     | NO   | PRI | NULL    | auto_increment || name  | varchar(4) | NO   |     | NULL    |                || age   | int(2)     | NO   |     | NULL    |                |+-------+------------+------+-----+---------+----------------+3 rows in set (0.00 sec
  • 在已有的表中设置primary key字段

    -alter table 表名 add primary key(字段名);

mysql> desc test2;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | int(3)     | NO   |     | NULL    |       || name  | varchar(4) | NO   |     | NULL    |       || age   | int(2)     | NO   |     | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.01 sec)mysql> alter table test2 add primary key(name);Query OK, 0 rows affected (0.05 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test2;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | int(3)     | NO   |     | NULL    |       || name  | varchar(4) | NO   | PRI | NULL    |       || age   | int(2)     | NO   |     | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.00 sec)
  • 移除表中的PRIMARY KEY字段

    -alter table 表名 drop primary key;(如果有auto_increment则需要先移除再移除主键,移除auto_incrememt为对该字段type重新赋值)

ysql> desc test2;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | int(3)     | NO   | PRI | NULL    |       || name  | varchar(4) | NO   |     | NULL    |       || age   | int(2)     | NO   |     | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.00 sec)mysql> alter table test2 drop primary key;Query OK, 0 rows affected (0.31 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test2;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | int(3)     | NO   |     | NULL    |       || name  | varchar(4) | NO   |     | NULL    |       || age   | int(2)     | NO   |     | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.01 sec)


foreign key 外键

  • 基本概念

    -让当前表字段的值在另一个表中字段值得范围内选择。

  • 使用外键的条件

    -表的存储引擎必须是innodb

    -字段类型要一致

    -被参照字段必须要是索引类型的一种(primary key)

  • 基本用法

mysql> create table yuangong(    -> yg_id int(4) auto_increment,    -> name char(16) not null,    -> primary key(yg_id)    -> );Query OK, 0 rows affected (0.31 sec)mysql> create table gongzi(    -> gz_id int(4) not null,    -> name char(15) not null,    -> gz float(6,2) not null default 0,    -> index(name),    -> foreign key(gz_id) references yuangong(yg_id)    -> on update cascade on delete cascade    -> );Query OK, 0 rows affected (0.32 sec)
  • 删除外键字段

    -alter table 表名 drop foreign key 约束名;

mysql> show create table gongzi\G;*************************** 1. row ***************************       Table: gongziCreate Table: CREATE TABLE `gongzi` (  `gz_id` int(4) NOT NULL,  `name` char(15) NOT NULL,  `gz` float(6,2) NOT NULL DEFAULT '0.00',  KEY `name` (`name`),  KEY `gz_id` (`gz_id`),  CONSTRAINT `gongzi_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yuangong` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.01 sec)mysql> alter table gongzi drop foreign key gongzi_ibfk_1;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> show create table gongzi\G;*************************** 1. row ***************************       Table: gongziCreate Table: CREATE TABLE `gongzi` (  `gz_id` int(4) NOT NULL,  `name` char(15) NOT NULL,  `gz` float(6,2) NOT NULL DEFAULT '0.00',  KEY `name` (`name`),  KEY `gz_id` (`gz_id`)) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)


UNIQUE索引

  • 基本概念

    -UNIQUE表示唯一性,同一个字段可以有多个字段具有唯一性

  • 创建表时指定UNIQUE索引字段

    查看新建test3表的字段结构,可发现UNIQUE字段的KEY标志为UNI;另外,由于字段name必须满足"NOT NULL"的非空约束,所以将其设置为UNIQUE后会自动变成了PRIMARY KEY主键字段:

mysql> create table test3(    -> id char(6),    -> name varchar(4) not null,    -> age int(3) not null,    -> unique(id),unique(name),index(age)    -> );Query OK, 0 rows affected (0.36 sec)mysql> desc  test3;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | char(6)    | YES  | UNI | NULL    |       || name  | varchar(4) | NO   | PRI | NULL    |       || age   | int(3)     | NO   | MUL | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.00 sec)
  • 删除UNIQUE索引,在已有的表中设置UNIQUE索引字段

mysql> drop index name on test3;Query OK, 0 rows affected (0.07 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test3;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | char(6)    | YES  | UNI | NULL    |       || name  | varchar(4) | NO   |     | NULL    |       || age   | int(3)     | NO   | MUL | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.00 sec)
  • 在已有表中建立UNIQUE索引

mysql> create unique index name on test3(name);Query OK, 0 rows affected (0.06 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc test3;+-------+------------+------+-----+---------+-------+| Field | Type       | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id    | char(6)    | YES  | UNI | NULL    |       || name  | varchar(4) | NO   | PRI | NULL    |       || age   | int(3)     | NO   | MUL | NULL    |       |+-------+------------+------+-----+---------+-------+3 rows in set (0.00 sec)












字段 索引 数据 类型 唯一性 多个 标志 概念 中设 普通 时候 条件 速度 一致 一行 优点 优缺点 使用说明 信息 全文 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 北京路客互联网科技有限公司 互联网科技工作委员会毛军 科技与互联网 科技类互联网 互联网金融 科技 互联网金融与金融科技 上海互联网科技有限公司 紫鲸互联网科技 深圳天众互联网科技公司 融贸通互联网科技 贵州叶脉互联网科技有限公司所属行业 重庆互联网医院沙龙医盟信息科技 迪庆互联网科技招生 卓翼科技产业互联网合作 互联网企业科技类企业如何做账 广州千川互联网科技有限公司 扫呗互联网科技有限公司 科技互联网经济论坛 广州全民伙伴互联网科技有限公司 互联网科技官网 深圳互联网科技公司 华中科技大学互联网 汉立互联网科技有限公司联系电话 互联网科技和信息 华夏恒生科技与互联网科技 高科技互联网发展前景如何 美国互联网科技实力 云南省自由互联网科技有限公司 互联网与数字科技关系
0