《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 安装并启动 ...
随机推荐
- Python爬虫学习笔记-2.Requests库
Requests是Python的一个优雅而简单的HTTP库,它比Pyhton内置的urllib库,更加强大. 0X01 基本使用 安装 Requests,只要在你的终端中运行这个简单命令即可: pip ...
- Redis 操作集合数据
Redis 操作集合数据: > sadd set1 Tom // sadd 用于往集合中添加元素 (integer) > sadd set1 John (integer) > sad ...
- 第五篇:Hadoop流
前言 Hadoop流提供了一个API,允许用户使用任何脚本语言编写Map函数或Reduce函数. 本文对此知识点进行介绍. Hadoop流的工作原理 在以前的例子中,Map和Reduce工作都是由类来 ...
- cannot access android.support.v4.app.BaseFragmentActivityJB的解决
//implementation 'com.android.support:appcompat-v7:26.1.0' 改成implementation 'com.android.support:app ...
- python中的数据类型与json的数据类型之间的转化
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- linux 开机自启转载
设置开机启动示例: # touch /etc/init.d/rc.local 设置为可执行: # chmod +x /etc/init.d/rc.local 用 update-rc.d 设置启动级别: ...
- JS使用中碰到的一些问题
settimeout: 1.setTimeout(function () {//这个则会在1秒后进行弹出1 alert(1); }, 1000); 2.setTimeout(alert(1), 100 ...
- sklearn 中的 Pipeline 机制 和FeatureUnion
一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...
- 支持AIRPLAY ,DLNA,MIRACAST的HDMI DONGLE
好吧,今天没节操,帮老婆推广一下淘宝的店. 联我影棒 http://item.taobao.com/item.htm?spm=a230r.1.14.132.jqGLCa&id=36476326 ...
- 【CSS系列】网页头部进度条方式一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...