《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 安装并启动 ...
随机推荐
- PostgreSQL主备切换
备库如何激活 在PostgreSQL(HOT-Standby)如主库出现异常.备库如何激活:来替换主库工作.有下列2种方式 备库在recovery.conf文件中有个配置项trigger_file.它 ...
- Selenium 执行JavaScript
Selenium 可以直接模拟运行 JavaScript,使用 execute_script() 方法即可实现 from selenium import webdriver browser = web ...
- RabbitMQ与java、Spring结合实例详细讲解
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了rabbitMq,提供了如何在Ubuntu下安装RabbitMQ 服务的方法. ...
- 由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1'
由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1' 此时进入系统已root模式 ...
- PHP 简易导出excel 类解决Excel 打开乱码
<?php class exportCsv{ //列名 protected $_column = array(); protected $_reg = array(); public $ret ...
- 机器学习算法--GBDT
转自 http://blog.csdn.net/u014568921/article/details/49383379 另外一个很容易理解的文章 :http://www.jianshu.com/p/0 ...
- 【Linux基础学习】Ubuntu 常用命令大全
一.文件目录类 1.建立目录:mkdir 目录名 2.删除空目录:rmdir 目录名 3.无条件删除子目录: rm -rf 目录名 4.改变当前目录:cd 目录名 (进入用户home目录:cd ~:进 ...
- openlayers中利用vector实现marker的方式
项目需要一个小型的gis.openlayers,geoserver,postgres组合是比较好的选择. openlayers的marker层好像不支持拖动操作.通过研究api发现,可以利用vecto ...
- C++ 操作符new和delete
参考资料: http://en.cppreference.com/w/cpp/memory/new/operator_new http://en.cppreference.com/w/cpp/memo ...
- Calling a Java Method from Native Code
http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html Calling Java Method ...