导游

  • 索引
    • 索引设计原则
    • 使用流程
    • 为什么要建立索引?
    • 索引优缺
  • 索引类型
    • 创建索引语法
    • 普通索引
    • 唯一索引
    • 主键索引
    • 复合索引

索引

在关系数据库中,索引是对数据库表中指定字段的一种存储结构。索引也是一张表,表中存储着索引的字段值和该值所在的物理位置。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引设计原则

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

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

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

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

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

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

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

使用流程

1.首先使用查询语句,通过索引字段查找记录

2.数据库根据索引找到指定列的值。

3.然后通过指针找到包含该值的行。

为什么要建立索引?

如果不使用索引,MySQL必须从表中的第一条记录开始,对整张表进行遍历,直到找出相关的记录。表中记录越多,查询数据所花费的时间越多,缺乏灵活性。

如果使用了索引,数据库能快速地通过索引去查找对应条件的记录,不必遍历数据表,有效地节省查询时间。

索引优缺

优点:
1.加快表与表之间的连接。

2.大大加快数据的查询速度。

3.所有的数据类型都可以被索引。

缺点:
1.索引的创建和维护也是需要时间的,并且随着数据的增加而增加。

2.每一条索引的记录都会占用一定的磁盘空间。

3.对表中数据的增删改查,索引也会修改。

索引类型

类型 作用
普通索引 基本索引方式,无特别说明
唯一性索引 数据唯一,允许有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: test1Non_unique: 1Key_name: index_id       Seq_in_index: 1Column_name: idCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment:Visible: YESExpression: 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: 1select_type: SIMPLEtable: test1partitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 4filtered: 25.00Extra: 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: 1select_type: SIMPLEtable: test1partitions: NULLtype: ref
possible_keys: index_idkey: index_idkey_len: 5ref: constrows: 1filtered: 100.00Extra: 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索引(INDEX)是什么?相关推荐

  1. mysql general clomun_关于MySQL索引index杂谈

    MySQL建索引命令 create index index_name on tablename(clomun_name.....); 比如建了 CREATE INDEX  O_N_P_D  ON   ...

  2. MySQL force Index 强制索引概述

    以下的文章主要介绍的是MySQL force Index  强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...

  3. MySQL 索引条件下推 Index Condition Pushdown

    MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下: 内容摘录自<深入理解MariaDB和MySQL& ...

  4. MySQL - 索引下推 Index Condition Pushdown 初探

    文章目录 生猛干货 Pre ICP 索引下推的含义 范围查找为啥不行? 搞定MySQL 生猛干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 索 ...

  5. MySQL索引与Index Condition Pushdown(二)

    实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...

  6. MySQL笔记(五)索引 index

    这是我在学习Mysql之路上做的笔记,今天将它粘出来.这一篇主要是Mysq的l索引index.有错误的欢迎大家指出.. 数据库的创建参考我的另一篇博客 https://blog.csdn.net/cs ...

  7. mysql gis index 索引原理_从原理到优化,深入浅出数据库索引

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的 ...

  8. MYSQL force index索引优化

    mysql索引优化一直以来是DBA和开发人员长期坚持的一项基本工作,合理的索引对于业务来说非常重要,合理的索引能有效改善性能.因此在开发中,定期排查索引的有效性很重要,排查的根据就是历史sql,排查的 ...

  9. mysql gis index 索引原理_Mysql 索引原理及优化

    Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...

最新文章

  1. ASP.NET 2.0防止同一用户同时登陆【转】
  2. 部署文档撰写经验分享
  3. GPE监控多台MySQL_zabbix监控多个服务器
  4. WinSock重叠I/O模型
  5. css 中 float 和 clear 的作用
  6. for循环执行 mybatis_Mybatis中使用循环遍历
  7. 看了看几个数据库厂商的发展历史
  8. python arma_Python实现ARMA模型
  9. 工作两年前端经验分享
  10. 电脑键盘部分按键失灵_笔记本键盘个别按键失灵怎么处理win10
  11. 【coq】函数语言设计 笔记 01 - basics
  12. “大中台、小前台”并非一招鲜,企业要做好这5大基础模块
  13. linux 开启ssdp服务,无法网络发现,Windows Server 2012如何启用SSDP Discovery服务
  14. 基于SpringBoot生鲜商城
  15. Python : 7-6 三天打鱼两天晒网 (15 分)
  16. crc16,crc32校验
  17. Tokenview.io推出ETH 2.0信标链浏览器
  18. 天宇优配|沪指冲高回落跌0.35%,地产、医药等板块走强,供销社概念再创新高
  19. 页面置换算法相关概念和计算
  20. 在这款水性厚浆型涂料消泡剂面前去除泡沫就是快而又好

热门文章

  1. 信号与系统陈后金matlab,陈后金信号与系统matlab实验7.pdf
  2. 简单聊天室的设计 C++ MFC
  3. 基于Python语言的PUBG游戏数据可视化分析系统
  4. Android蓝牙bt/ble开发
  5. EIPC5-0640RSD01伺服内啮合齿轮泵
  6. 计算机维护与管理实践报告,计算机维护实习报告.doc
  7. Python语言学习之关于quote()使用
  8. https与ssl的工作原理
  9. 网络生命大百科全书项目
  10. 微服务架构从入门到精通(一)微服务介绍