一:索引概述?

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

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

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

二:索引的优点/缺点?

  - 优点

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

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

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

    - 将随机 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. 【AI】Win10-Tensorflow

    一.安装 第一步:先安装anaconda3第二步:pip install --upgrade --ignore-installed tensorflow或者:pip install tensorflo ...

  2. httpClient创建对象、设置超时

    从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...

  3. linux 下的爆破工具hydra

    http://www.cnblogs.com/mchina/archive/2013/01/01/2840815.html 安装手册 http://www.aldeid.com/wiki/Thc-hy ...

  4. CentOS7--Firewalld防火墙

    Firewalld服务是红帽RHEL7系统中默认的防火墙管理工具,特点是拥有运行时配置与永久配置选项且能够支持动态更新以及"zone"的区域功能概念,使用图形化工具firewall ...

  5. 导入贴图操作:处理贴图MaxSize和Format

    using UnityEngine; using System.Collections; using UnityEditor; public class ImportModflyTextures : ...

  6. date 类型转为varchar

    select t.type_id as typeId, t.type_name as typeName, t.type_order as typeOrder, t.type_link as typeL ...

  7. SpringBoot集成Mybatis并具有分页功能PageHelper

    SpringBoot集成Mybatis并具有分页功能PageHelper   环境:IDEA编译工具   第一步:生成测试的数据库表和数据   SET FOREIGN_KEY_CHECKS=0;   ...

  8. C# GIF图片的分解以及合成

    dll下载的地址 http://www.codeproject.com/Articles/11505/NGif-Animated-GIF-Encoder-for-NET   使用主要调用的是Compo ...

  9. linux c++环境

    set expandtab set autoindent set smartindent

  10. 题目1454:Piggy-Bank(完全背包问题)

    题目链接:http://ac.jobdu.com/problem.php?pid=1454 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...