MySQL 索引

1 什么是索引

  • 在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令 MySQL 的查询和

    运行更加高效。
  • 如果合理的设计且使用索引的 MySQL 是一辆兰博基尼的话,那么没有设计和使用索引的 MySQL 就是

    一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目

    录(索引)快速查找到需要的字

2 常见索引分类

索引名称 说明
主键索引(primary key) 主键是一种唯一性索引,每个表只能有一个主键, 用于标识数据表中的每一条记录
唯一索引 (unique) 唯一索引指的是 索引列的所有值都只能出现一次, 必须唯一.
普通索引 (index) 最常见的索引,作用就是 加快对数据的访问速度

MySql 将一个表的索引都保存在同一个索引文件中, 如果对中数据进行增删改操作,MySql 都会自动的更

新索引.

2.1 主键索引 (PRIMARY KEY)

特点: 主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的某一条记录。

  • 一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL
  • 创建一个只有字段的数据库表 demo01
CREATE TABLE demo01(
did INT,
dname VARCHAR(20),
hobby VARCHAR(30)
);

创建主键索引

  • 语法格式
  • 创建表的时候直接添加主键索引 (最常用)
CREATE TABLE 表名(
-- 添加主键 (主键是唯一性索引,不能为null,不能重复,)
字段名 类型 PRIMARY KEY,
);
  • 修改表结构 添加主键索引
ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )
  • 为 demo1 表添加主键索引
ALTER TABLE demo01 ADD PRIMARY KEY ( did )

2.2 唯一索引(UNIQUE)

特点: 索引列的所有值都只能出现一次, 必须唯一.

  • 唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了 提高访问速度,而只是为了避免数据出现重复。

创建唯一索引

语法格式

  • 创建表的时候直接添加主键索引
CREATE TABLE 表名(
列名 类型(长度),
-- 添加唯一索引
UNIQUE [索引名称] (列名)
);
  • 使用 create 语句创建: 在已有的表上创建索引
create unique index 索引名 on 表名(列名(长度))
  • 修改表结构添加索引
ALTER TABLE 表名 ADD UNIQUE ( 列名 )
  • 为 hobby 字段添加唯一索引
create unique index ind_hobby on demo01(hobby)

测试

  • 向表中插入数据
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)中的数据列创建

    索引。

创建普通索引

语法格式

  • 使用 create index 语句创建: 在已有的表上创建索引
create index 索引名 on 表名(列名[长度])
  • 修改表结构添加索引
ALTER TABLE 表名 ADD INDEX 索引名 (列名)
  • 给 dname 字段添加索引
# 给dname字段添加索引
alter table demo01 add index dname_indx(dname);

4 删除索引

  • 由于索引会占用一定的磁盘空间,因此,为了避免影响数据库的性能,应该及时删除不再使用的索

  • 语法格式
ALTER TABLE table_name DROP INDEX index_name;
  • 删除 demo01 表中名为 dname_indx 的普通索引
ALTER TABLE demo01 DROP INDEX dname_indx;

3 索引性能测试

1 导入数据表

  • 下载测试 sql

  • 找到软件文件夹下的 测试索引.sql 文件, 点击执行

  • 运行出现以下问题

  • Err 1153 - Got a packet bigger than 'max_allowed_packet' bytes

  • 由于数据量较大,mysql 会对单表数据量较大的 SQL 做限制,10w 条数据的字符串超出了 max_allowed_packet

    的允许范围。

解决办法

找到 :max_allowed_packet 可以ctrl+f 搜索 修改默认值为419430400 大概是400M

查看我们是否修改成功

下面步入正题

  • 查询 test_index 表中的总记录数 ·表中有 500万条数据
SELECT COUNT(*) FROM test_index;

  • 测试

在没有添加索引的情况下, 使用 dname 字段进行查询

#未添加索引,进行分组查询
SELECT * FROM test_index GROUP BY dname;

为dname字段添加普通索引

  • 注意: 一般我们都是在创建表的时候 就确定需要添加索引的字段
#添加索引
ALTER TABLE test_index ADD INDEX dname_indx(dname);

4 索引的优缺点总结

  • 添加索引首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 索引的优点
    1. 大大的提高查询速度
    2. 可以显著的减少查询中分组和排序的时间。
  • 索引的缺点
    1. 创建索引和维护索引需要时间,而且数据量越大时间越长
    2. 当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护

      速度

简单使用 MySQL 索引的更多相关文章

  1. mysql 索引的简单使用

    1 索引(index) 索引是一个单独的.物理的数据库结构, 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单 他的作用和字典的目录是一样的,就是为了加快查询的速度 ...

  2. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  3. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  4. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  5. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. MySQL索引类型总结和使用技巧以及注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...

  7. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

  8. mysql索引总结----mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  9. Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合

    索引 数据库的索引就像一本书的目录,能够加快数据库的查询速度. MYSQL索引有四种PRIMARY.INDEX.UNIQUE.FULLTEXT, 其中PRIMARY.INDEX.UNIQUE是一类,F ...

随机推荐

  1. springMvc和Hibernate集成实现用户添加

    源码:http://pan.baidu.com/s/1i4xVLE9(百度云) 步骤:一.创建数据库(mysql) 二.导入相应jar包(注意不同数据库jdbc.jar包)配置web.xml.spri ...

  2. python之数据类型的内置方法(str, list)

    目录 字符串的内置方法 移除首尾指定字符 字母大小写相关操作 判断字符串的开头或结尾是否是指定字符 字符串特殊的输出方法 拼接字符串 替换指定字符 判断是否是纯数字 查找指定字符对应的索引值 文本位置 ...

  3. K8S 使用Kubeadm搭建单个Master节点的Kubernetes(K8S)~本文仅用于测试学习

    01.集群规划 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:kubeadm.kubernetes-1.15.docker-ce-18.09 硬件要求: ...

  4. springcloud 断路器

    https://www.jb51.net/article/138572.htm 参考资料: http://www.cnblogs.com/ulysses-you/p/7281662.html http ...

  5. 浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程

    前言 为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较.通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web ...

  6. 在 GitHub 上玩转开源项目的 Code Review

    一.幕后故事 时光荏苒,岁月如梭-- (太文绉绉了,这不是我的风格) 今天我准备聊聊在 GitHub 上如何玩 Code Review. 突发奇想?心血来潮?不是. 咋回事呢?(对八卦不感兴趣的可以直 ...

  7. GraphX 图计算实践之模式匹配抽取特定子图

    本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...

  8. 实验一:在FW上配置静态路由实现互通

    实验:在FW上配置静态路由实现互通 网络拓扑图 一.配置步骤 1.配置IP地址 R1: FW: ISP:       2.配置路由 ①在R2上面配置静态路由 ②在ISP上面配置静态路由 3.在FW上配 ...

  9. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  10. 编程技巧│浏览器 Notification 桌面推送通知

    目录 一.什么是 Notification 二.弹窗授权 三.弹窗使用 四.浏览器支持检测 五.授权回调 六.3秒后关闭弹窗 一.什么是 Notification Notification 是浏览器最 ...