一:索引概述?

  - 数据库里的数据是以文件的形式存储的,里面放了我们的各种数据。就和一本书一样。

  - 通俗的来说,索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找。

  - 就像你不会给你的一本书上的每一页都加上索引一样,索引的建立和维护也需要考虑。

二:索引的优点/缺点?

  - 优点

    - 使用索引的列,会在查询时大大的加速查询速度。

    - 大大减少服务器需要扫描的数据量。

    - 帮助服务器避免排序和临时表。

    - 将随机 I/O,变为 顺序I/O。

  - 缺点

    - 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

    - 索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

    - 当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

三:索引的使用原则?

   - 索引适合在中到大型的表中建立会高效。

    - 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引。

  - 数据量小的表,使用全表扫描查询会更高效。

    - 数据量小的表最好不要使用索引

    - 因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

  - 超过500W的表,应该考虑使用 分区/分表 进行处理

四:如何建立索引 (B+Tree)?

  - 查看当前表的索引

    - SHOW INDEX FROM 表名 \G;

  - 建立索引

    - 单列索引

      - CREATE INDEX 索引名 ON 表(字段);

    - 前缀索引

      - CREATE INDEX 索引名 ON 表(字段(长度));

    - 唯一索引

      - CREATE UNIQUE INDEX 索引名 ON 表(字段);

    - 主键索引

      - ALTER TABLE `表名` ADD PRIMARY KEY (`字段名`);

    - 多列索引

      - CREATE INDEX 索引名 ON 表(字段1, 字段2, ...);

五:高性能的索引策略

  - 限制每张表的索引数量

    - 一张表不要超过五个,索引不是越多越好,会提高/也会降低索引

    - 禁止给每一列建立索引,并不會获得很好的效果

  - 对于 Varchar/Char/Text 等字段,最好使用 前缀索引

    - 优点

      - 前缀索引能有效减小索引文件的大小,提高索引的速度。

    - 缺点

      -  不能在 ORDER BY 或 GROUP BY 中使用前缀索引。

      -  也不能把它们用作覆盖索引(Covering Index)。

    - 建立

      - 为了创建前缀索引的合适长度,确定区分度,建立前缀索引

      - SELECT COUNT(DISTINCT LEFT(column_name, $length)) / COUNT(*) FROM table_name;

  - 在哪些列上建立索引?

    - 在 select/update/delete SQL中的 where 条件中建立索引

    - 在 order by / group by 字段上建立索引

  - 多列索引的建立

    - 将区分度最高的列放在索引最前列(不是绝对,需要根据具体的情况来定)

    - 尽量将查询包含在多列索引中

    - SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM table_name;

  - 对于联合索引来说,要遵守最左前缀法则

    - 举列来说索引含有字段id、name、school,可以直接用id字段,也可以id、name这样的顺序,但是name;school都无法使用这个索引。

    - 所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。

《Mysql 索引》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. bodgeit测试平台

    下载war安装包:https://code.google.com/archive/p/bodgeit/downloads http://resources.infosecinstitute.com/t ...

  2. SaltStack Grains 和 Pillar

    Grains: (1) grains 是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息(2) grains 是 minion 启动时收集到的一些系统信息,比如操作系统版本.内核版本.C ...

  3. Git服务器的搭建和使用

    一.GIT服务器的搭建 1. 安装Git yum -y install git 2. 创建git用户 adduser git 3. 创建证书登陆   收集所有客户端需要登录的用户的公钥,就是他们自己的 ...

  4. 天猫浏览型应用的CDN静态化架构演变(转)

    转自:http://wbj0110.iteye.com/blog/2036613 在天猫双11活动中,商品详情.店铺等浏览型系统,通常会承受超出日常数倍甚至数十倍的流量冲击.随着历年来双11流量的大幅 ...

  5. C++ template —— 实例化和模板实参演绎(四)

    本篇讲解实例化和模板实参演绎-------------------------------------------------------------------------------------- ...

  6. oracle如何链接到另外一个数据库DB_LINK

    命令创建从一个库连接的另外一个库: create database link DB_XXX  --创建连接的名字connect to db_xxx --数据库名identified by DB-XXX ...

  7. JSP基本用法(二)隐含对象

    一.摘要 在JSP容器中生成的Servlet类的_jspService()方法中,定义了几个对象,在编写JSP页面时我们可以使用这些隐含对象. PageContext pageContext = nu ...

  8. React Native 入门到原理(详解)

    抛砖引玉(帮你更好的去理解怎么产生的 能做什么) 砖一.动态配置 由于 AppStore 审核周期的限制,如何动态的更改 app 成为了永恒的话题.无论采用何种方式,我们的流程总是可以归结为以下三部曲 ...

  9. 【EF框架】EF DBFirst 快速生成数据库实体类 Database1.tt

    现有如下需求,数据库表快速映射到数据库实体类 VS给出的两个选择都有问题,并不能实现,都是坑啊 EF .x DbContext 生成器 EF .x DbContext 生成器 测试结果如下 生成文件 ...

  10. delphi 10 Seattle 第一个Android程序

    delphi 10 Seattle 第一个Android程序 1.打开Delphi RAD Studio Seattle,如下图     2.选择black application 点击OK   3. ...