MySQL:MySQL 索引
1 什么是索引
在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和 运行更加高效。
如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是 一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目 录(索引)快速查找到需要的字。
2 常见索引分类
索引名称 | 说明 |
主键索引 (primary key) | 主键是一种唯一性索引,每个表只能有一个主键, 用于标识数据表中的每一 条记录 |
唯一索引 (unique) | 唯一索引指的是 索引列的所有值都只能出现一次, 必须唯一 |
普通索引 (index) | 最常见的索引,作用就是 加快对数据的访问速度 |
MySql将一个表的索引都保存在同一个索引文件中, 如果对中数据进行增删改操作,MySql都会自动的更 新索引.
3 主键索引 (PRIMARY KEY)
特点: 主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的某一条记录。
一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。
代码示例:
1) 创建db4数据库
CREATE DATABASE db4 CHARACTER SET utf8;
2) 创建 demo01表
CREATE TABLE demo01( did INT, dname VARCHAR(20), hobby VARCHAR(30) );
3) 语法格式
- 创建表的时候直接添加主键索引 (最常用)
CREATE TABLE 表名( -- 添加主键 (主键是唯一性索引,不能为null,不能重复) 字段名 类型 PRIMARY KEY, );
- 修改表结构 添加主键索引
ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )
4) 为demo1 表添加主键索引
ALTER TABLE demo01 ADD PRIMARY KEY (did);
4 唯一索引(UNIQUE)
特点: 索引列的所有值都只能出现一次, 必须唯一.
唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
1) 语法格式
创建表的时候直接添加主键索引
CREATE TABLE 表名( 列名 类型(长度), -- 添加唯一索引 UNIQUE [索引名称] (列名) );
使用create语句创建: 在已有的表上创建索引
create unique index 索引名 on 表名(列名(长度))
修改表结构添加索引
ALTER TABLE 表名 ADD UNIQUE ( 列名 )
2) 为 hobby字段添加唯一索引
create unique index ind_hobby on demo01(hobby)
3) 向表中插入数据
INSERT INTO demo01 VALUES(1,'张三','DBJ'); # 报错Duplicate entry 'DBJ' for key 'hobby' # 唯一索引保证了数据的唯一性,索引的效率也提升了 INSERT INTO demo01 VALUES(2,'李四','DBJ');
3 普通索引 (INDEX)
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column=)或排序条件(ORDERBY column)中的数据列创建索引。
1) 语法格式
使用create index 语句创建: 在已有的表上创建索引
create index 索引名 on 表名(列名[长度])
修改表结构添加索引
ALTER TABLE 表名 ADD INDEX 索引名 (列名)
2) 给 dname字段添加索引
# 给dname字段添加索引 alter table demo01 add index dname_indx(dname)
4 删除索引
由于索引会占用一定的磁盘空间,因此,为了避免影响数据库的性能,应该及时删除不再使用的索引
1) 语法格式
ALTER TABLE table_name DROP INDEX index_name;
2) 删除 demo01 表中名为 dname_indx 的普通索引
ALTER TABLE demo01 DROP INDEX dname_indx;
5 索引性能测试
<1> 选中 db4数据库 右键 导入SQL脚本
<2> 找到软件文件夹下的 测试索引.sql文件, 点击执行
<3> 查询 test_index 表中的总记录数
SELECT COUNT(*) FROM test_index;
表中有 500万条数据
<4> 测试
在没有添加索引的情况下, 使用 dname 字段进行查询
#未添加索引,进行分组查询 SELECT * FROM test_index GROUP BY dname;
耗时
执行:33.774 sec
为 dname字段 添加索引
#添加索引 ALTER TABLE test_index ADD INDEX dname_indx(dname);
注意: 一般我们都是在创建表的时候 就确定需要添加索引的字段
执行分组查询
SELECT * FROM test_index GROUP BY dname;
耗时
执行:0.001 sec
6 索引的优缺点总结
- 添加索引首先应考虑在 where 及 order by 涉及的列上建立索引。
- 索引的优点
- 大大提高查询速度
- 显著减少查询中分组和排序的时间
- 索引的缺点
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护 速度
原文地址:https://www.cnblogs.com/JasperZhao/p/15023325.html
- 1分钟懂awk-技不在深,够用就行
- RChain节点通信机制
- Spark源码系列(一)spark-submit提交作业过程
- Android安全几道入门题目
- 挖洞经验 | 看我如何通过子域名接管绕过Uber单点登录认证机制
- Spark源码系列(二)RDD详解
- Spark源码系列(三)作业运行过程
- Spark源码系列(四)图解作业生命周期
- Spark源码系列(五)分布式缓存
- 看我如何基于Python;Facepp打造智能监控系统
- Spark源码系列(六)Shuffle的过程解析
- Spark源码系列(九)Spark SQL初体验之解析过程详解
- Spark源码系列(七)Spark on yarn具体实现
- 我们要在任何可能的地方测试XSS漏洞
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 【编译技术】:解读 Babel AST Format——01
- 【编译技术】:解读 Babel AST Format——02
- PyTorch入门笔记-PyTorch初见
- ssh 连接 Linux 服务器并安装 Anaconda
- Ant Design Vue 报错:Failed to resolve directive: ant-portal的解决办法
- 小程序生成二维码海报的组件-wxa-plugin-canvas
- kbone 是什么?这可能是最好的小程序开源框架
- jQuery根据填写的input的数值导出excel表格
- 小程序根据返回值英文渲染出对应的中文
- redis灵魂拷问:聊一聊AOF日志重写
- 小程序返回的时间戳转化成时间
- JSP 报错:ReferenceError: $ is not defined
- 小程序使用 组件库 vant-weapp详细教程
- DEBUG=1 宏定义对 @weakify 和 @strongify 的影响分析
- 为什么 demangle 会失败?