《Mysql 索引》
一:索引概述?
- 数据库里的数据是以文件的形式存储的,里面放了我们的各种数据。就和一本书一样。
- 通俗的来说,索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找。
- 就像你不会给你的一本书上的每一页都加上索引一样,索引的建立和维护也需要考虑。
二:索引的优点/缺点?
- 优点
- 使用索引的列,会在查询时大大的加速查询速度。
- 大大减少服务器需要扫描的数据量。
- 帮助服务器避免排序和临时表。
- 将随机 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 索引》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Jackson(ObjectMapper)的简单使用(可转xml)
参考文章:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html (原文章更详细哦,且有介绍xml与java对象的互转) 参考文章作 ...
- PPT高手必须树立的十个理念
08 2014年08月 [263职场技巧]PPT高手必须树立的十个理念 理念一:文字是用来瞟的,不是读的 我们时不时听到这样的言论:“PPT很简单,就是把Word里的文字复制.粘贴呗.”这其实是对PP ...
- Jenkins构建触发器
我们在执行Jenkins的项目构建的时候一般都是通过web管理界面中的”构建”来执行项目构建操作,但是除此之外我们还可以通过项目配置中的”构建触发器”来触发构建操作, 其中”构建触发器”有一种方 ...
- TCPdump指定时间或者指定大小进行循环抓取报文
背景:我们用tcpdump工具循环抓取网卡上的报文,我们会遇到如下情况: 1. 抓取报文后隔指定的时间保存一次: 2. 抓取报文后达到指定的大小保存一次: 本文就这两种情况给出tcpdump的使用方法 ...
- Myeclipse10使用git
用Myeclipse安装egit,使用官网最新地址或者下载最新的egit插件到本地安装均在team中看不到git,最后发现到http://download.eclipse.org/egit/updat ...
- 【软件分析与挖掘】ELBlocker: Predicting blocking bugs with ensemble imbalance learning
摘要: 提出一种方法——ELBlocker,用于自动检测出Blocking Bugs(prevent other bugs from being fixed). 难度在于这些Blocking Bugs仅 ...
- delphi 函数参数传递 默认参数(传值)、var(传址)、out(输出)、const(常数)四类
参数可以分为: 默认参数(传值).var(传址).out(输出).const(常数)四类 {默认参数是传值, 不会被改变} function MyF1(x: Integer): Integer; be ...
- kafka---->kafka的使用(一)
今天我们来学习一下kafka的简单的使用与配置.世上有可以挽回的和不可挽回的事,而时间经过就是一种不可挽回的事. kafka的安装配置 一.kafka的使用场景 活动跟踪:网站用户与前端应用程序发生交 ...
- android基础---->WidGet的使用
Widget是一个可以添加在别的应用程序中的”小部件”,我们可以使用自定义的Widget远程控制我们的程序做一些事情.一般用于在桌面上添加一个小部件,现在我们开始小部件的学习. 目录导航: WidGe ...
- 【线程】Volatile关键字
Volatile变量具有 synchronized 的可见性特性,但是不具备原子特性.这就是说线程能够自动发现 volatile变量的最新值.Volatile变量可用于提供线程安全,但是只能应用于非常 ...