《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 安装并启动 ...
随机推荐
- 转载mysql数据库配置优化
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...
- PostgreSQL存储过程(1)-基于SQL的存储过程
什么是SQL函数? SQL函数包体是一些可执行的SQL语言.同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果. 除非SQL函数声明为返回void,否则最后一条语句必须是S ...
- jenkins配置RF构建结果显示
声明:转载请注明出处,谢谢 步骤1:安装robot framework plugin插件:系统管理-管理插件 步骤2:设置构建后操作:job-配置-构建后操作增加“Publish Robot Fram ...
- 免费SVN、Git项目托管主机推荐
Unfuddle 200MB的免费空间,界面友好,特性丰富,支持Git,但只能一个账户一个用户并且只允许一个项目,付费服务相对来说价格偏高 CodeSpaces 500MB,一个账户两个免费用户,付费 ...
- C++ template —— 模板特化(五)
本篇讲解模板特化-------------------------------------------------------------------------------------------- ...
- audio_policy.conf说明(翻译)
自己记着当笔记,水平有限,仅供参考 # # Audio policy configuration for generic device builds (goldfish audio HAL - emu ...
- 安装windows7/8/10到U盘或移动硬盘
https://jingyan.baidu.com/article/e52e36156f6ad240c60c518c.html jpg改rar
- 【Spring Boot&&Spring Cloud系列】Spring Boot项目集成Swagger UI
前言 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...
- scanf printf gets() puts(),cin cout
最近在练机试题,常用的C和C++输入输出如下: 1 scanf 和printf int a; scanf("%d",&a) ; printf("%d", ...
- ldap 配置过程详解
ldap常用名称解释 1.环境搭建 操作系统:centos6.5 x86_64关闭防火墙.selinux开启时间同步# crontab -e加入# time sync*/5 * * * * /usr/ ...