一:索引概述?

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

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

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

二:索引的优点/缺点?

  - 优点

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

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

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

    - 将随机 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. 【代码审计】CmsEasy_v5.7 代码执行漏洞分析

      0x00 环境准备 CmsEasy官网:http://www.cmseasy.cn/ 网站源码版本:CmsEasy_v5.7_UTF8-0208 程序源码下载: http://ftp.cmseas ...

  2. 【代码审计】后台Getshell的两种常规姿势

    0x00 前言 在早些年刚接触web安全的时候,基础套路都是找注入--找后台--找上传点--找数据库备份--Getshell,然而在代码审计的角度,也存在类似的基本操作. 这里结合代码实例介绍白盒Ge ...

  3. windows自启动脚本

    直接写一个普通批处理文件,如果是需要让它在系统启动时运行, 就将它放在C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup目录下, 如果是需要 ...

  4. ActiveX 控件导入程序

    ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件. http://msdn.microsoft.com/zh-cn/library/8 ...

  5. Twitter 高并发高可用架构

    解决 Twitter的“问题”就像玩玩具一样,这是一个很有趣的扩展性比喻.每个人都觉得 Twitter很简单,一个菜鸟架构师随便摆弄一下个可伸缩的 Twitter就有了,就这么简单.然而事实不是这样, ...

  6. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  7. JTAG、JLink、ULINK、ST-LINK仿真器区别(转)

    首先要了解一下JTAG. JTAG协议 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数 ...

  8. 【转载】Yui.Compressor高性能ASP.NET开发:自动压缩CSS、JS

    在开发中编写的js.css发布的时候,往往需要进行压缩,以减少文件大小,减轻服务器的负担.这就得每次发版本的时候,对js.js进行压缩,然后再发布.有没有什么办法,让代码到了服务器上边,它自己进行压缩 ...

  9. SharpGL学习笔记(六) 裁剪变换

    在OpenGL中,除了视景体定义的6个裁剪平面(上下左右前后)外, 用户还可以定义一个或者多个附加的裁剪平面,以去掉场景中无关的目标. 附加平面裁剪函数原型如下: ClipPlane(OpenGL.G ...

  10. 实战BRTSvc一款我见过的最嚣张的挖矿软件

    第一步:发现告警 Suricata发现特征字符串jsonrpc,这个是匹配挖矿木马的一个重要特征.于是开始分析告警信息: 告警中可以提取出的有效信息如下: 目标IP:149.28.199.108 目标 ...