Mysql索引概述(用于个人学习与回顾)
admin
2023-04-16 22:21:29
0

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: 0
mysql> 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: 0
mysql> 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: 0
mysql> 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: 0
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)


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: gongzi
Create 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=latin1
1 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: 0

mysql> show create table gongzi\G;
*************************** 1. row ***************************
       Table: gongzi
Create 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=latin1
1 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: 0
mysql> 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: 0
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)












相关内容

热门资讯

徐巧芯剖析赖清德:最怕自己丢掉... 海峡导报综合报道 大罢免投票一周年纪念活动26日举行,台北市长蒋万安出席并怒轰,民进党一年过后仍没有...
中国红十字会总会紧急向广东调拨... 记者从中国红十字会总会了解到,针对台风“红霞”给广东造成的灾情,中国红十字会总会启动四级应急响应,紧...
这些少年,正被“毒蛋”围猎 李梦抽了几口电子烟,吐出了白色的烟雾,有一股浓烈的水果香味。随后,她看着自己握电子烟的手,跟身边人说...
蒋万安号召“倒阁”,卢秀燕认为... 海峡导报综合报道 台北市长蒋万安27日抛出震撼议题,表示多名民代向他提议推动“倒阁”,要求台行政机构...
特朗普将在白宫会见两位重要客人 俄乌战争仍未结束,美伊冲突又有升级风险。在此背景下,美国总统特朗普将在白宫接见乌克兰和以色列领导人。...
新租客打扫卧室柜子上掉落4万元... 近日,莲前西路某小区内,张倩签下一套房子的租赁合同。当天上午,她带着12岁的大女儿周馨怡和11岁的小...
六部门通告:禁止涉军队退役报废... 关于禁止涉军队退役报废装备销售活动的通告近年来,部分经营者在线上线下公开销售涉及我军退役报废装备(指...
九寨沟景区发生泥石流,部分道路... 7月26日,九寨沟风景名胜区管理局发布泥石流灾害通报:2026年7月26日15时50分,九寨沟景区局...
空调26度不凉是什么原因 从空调内部元器件来说,不凉的原因有可能是温度传感器出现故障了,也有可能是空调压缩机或者铜管出现问题,...
鲸鸿动能携手香港国际机场、鸿蒙...   2026 年 7 月 25 日,十余位鸿蒙车主组成的车队从珠海出发,经港珠澳大桥通关抵达香港国际...