一:索引概述?

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

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

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

二:索引的优点/缺点?

  - 优点

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

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

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

    - 将随机 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. Jackson(ObjectMapper)的简单使用(可转xml)

    参考文章:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html  (原文章更详细哦,且有介绍xml与java对象的互转) 参考文章作 ...

  2. PPT高手必须树立的十个理念

    08 2014年08月 [263职场技巧]PPT高手必须树立的十个理念 理念一:文字是用来瞟的,不是读的 我们时不时听到这样的言论:“PPT很简单,就是把Word里的文字复制.粘贴呗.”这其实是对PP ...

  3. Jenkins构建触发器

       我们在执行Jenkins的项目构建的时候一般都是通过web管理界面中的”构建”来执行项目构建操作,但是除此之外我们还可以通过项目配置中的”构建触发器”来触发构建操作, 其中”构建触发器”有一种方 ...

  4. TCPdump指定时间或者指定大小进行循环抓取报文

    背景:我们用tcpdump工具循环抓取网卡上的报文,我们会遇到如下情况: 1. 抓取报文后隔指定的时间保存一次: 2. 抓取报文后达到指定的大小保存一次: 本文就这两种情况给出tcpdump的使用方法 ...

  5. Myeclipse10使用git

    用Myeclipse安装egit,使用官网最新地址或者下载最新的egit插件到本地安装均在team中看不到git,最后发现到http://download.eclipse.org/egit/updat ...

  6. 【软件分析与挖掘】ELBlocker: Predicting blocking bugs with ensemble imbalance learning

    摘要: 提出一种方法——ELBlocker,用于自动检测出Blocking Bugs(prevent other bugs from being fixed). 难度在于这些Blocking Bugs仅 ...

  7. delphi 函数参数传递 默认参数(传值)、var(传址)、out(输出)、const(常数)四类

    参数可以分为: 默认参数(传值).var(传址).out(输出).const(常数)四类 {默认参数是传值, 不会被改变} function MyF1(x: Integer): Integer; be ...

  8. kafka---->kafka的使用(一)

    今天我们来学习一下kafka的简单的使用与配置.世上有可以挽回的和不可挽回的事,而时间经过就是一种不可挽回的事. kafka的安装配置 一.kafka的使用场景 活动跟踪:网站用户与前端应用程序发生交 ...

  9. android基础---->WidGet的使用

    Widget是一个可以添加在别的应用程序中的”小部件”,我们可以使用自定义的Widget远程控制我们的程序做一些事情.一般用于在桌面上添加一个小部件,现在我们开始小部件的学习. 目录导航: WidGe ...

  10. 【线程】Volatile关键字

    Volatile变量具有 synchronized 的可见性特性,但是不具备原子特性.这就是说线程能够自动发现 volatile变量的最新值.Volatile变量可用于提供线程安全,但是只能应用于非常 ...