MySQL索引(INDEX)是什么?
导游
- 索引
- 索引设计原则
- 使用流程
- 为什么要建立索引?
- 索引优缺
- 索引类型
- 创建索引语法
- 普通索引
- 唯一索引
- 主键索引
- 复合索引
索引
在关系数据库中,索引是对数据库表中指定字段的一种存储结构。索引也是一张表,表中存储着索引的字段值和该值所在的物理位置。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引设计原则
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)是什么?相关推荐
- mysql general clomun_关于MySQL索引index杂谈
MySQL建索引命令 create index index_name on tablename(clomun_name.....); 比如建了 CREATE INDEX O_N_P_D ON ...
- MySQL force Index 强制索引概述
以下的文章主要介绍的是MySQL force Index 强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...
- MySQL 索引条件下推 Index Condition Pushdown
MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下: 内容摘录自<深入理解MariaDB和MySQL& ...
- MySQL - 索引下推 Index Condition Pushdown 初探
文章目录 生猛干货 Pre ICP 索引下推的含义 范围查找为啥不行? 搞定MySQL 生猛干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 索 ...
- MySQL索引与Index Condition Pushdown(二)
实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...
- MySQL笔记(五)索引 index
这是我在学习Mysql之路上做的笔记,今天将它粘出来.这一篇主要是Mysq的l索引index.有错误的欢迎大家指出.. 数据库的创建参考我的另一篇博客 https://blog.csdn.net/cs ...
- mysql gis index 索引原理_从原理到优化,深入浅出数据库索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的 ...
- MYSQL force index索引优化
mysql索引优化一直以来是DBA和开发人员长期坚持的一项基本工作,合理的索引对于业务来说非常重要,合理的索引能有效改善性能.因此在开发中,定期排查索引的有效性很重要,排查的根据就是历史sql,排查的 ...
- mysql gis index 索引原理_Mysql 索引原理及优化
Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...
最新文章
- ASP.NET 2.0防止同一用户同时登陆【转】
- 部署文档撰写经验分享
- GPE监控多台MySQL_zabbix监控多个服务器
- WinSock重叠I/O模型
- css 中 float 和 clear 的作用
- for循环执行 mybatis_Mybatis中使用循环遍历
- 看了看几个数据库厂商的发展历史
- python arma_Python实现ARMA模型
- 工作两年前端经验分享
- 电脑键盘部分按键失灵_笔记本键盘个别按键失灵怎么处理win10
- 【coq】函数语言设计 笔记 01 - basics
- “大中台、小前台”并非一招鲜,企业要做好这5大基础模块
- linux 开启ssdp服务,无法网络发现,Windows Server 2012如何启用SSDP Discovery服务
- 基于SpringBoot生鲜商城
- Python : 7-6 三天打鱼两天晒网 (15 分)
- crc16,crc32校验
- Tokenview.io推出ETH 2.0信标链浏览器
- 天宇优配|沪指冲高回落跌0.35%,地产、医药等板块走强,供销社概念再创新高
- 页面置换算法相关概念和计算
- 在这款水性厚浆型涂料消泡剂面前去除泡沫就是快而又好