MySQL索引设计需要考虑哪些因素?
索引小知识
篇幅有限,索引的基本知识我们就不赘述了,在此,我们尝试说明其中的一个小点-----B+树与B树的区别到底是什么。
InnoDB是使用B+树来实现其索引功能的。在B+树中,内节点(非叶子节点)存储了行数据的键,而叶子节点存储了所有的行数据,而B树的每个节点都存储了真实的数据。这种数据结构,决定了两者有以下不同点:
(1)非叶子节点能存放指针的数据量。因为B树的非叶子节点存放的是整行的数据,占用了较多的空间,所以能存放指针就相对较少,因此整个B树的层数就变高。当数据量比较大时,插入更新会导致维护代价也是比较大的,而且层数越高,搜索的性能就会越低。而B+树的内节点存放的是相对短很多的键值,就克服了B树遇到的问题。
(2)从数据结构上来看,B树的查询效率与数据所在的位置有关。即如果所要搜索的数据节点,在树上的位置,越靠近根节点,查询返回结果越快,最差的就是数据位于叶子节点上,不同的节点位置,其性能不均衡;而B+树,完整的数据都是在叶子节点上,其查询效率是固定的。插入、删除操作同样的原理,在B树中,其复杂度明显增加,而B+树相对简单的多。例如,B+树,在插入过程中,只需要通过在每一层搜索一个节点,依次找到节点之后,在节点处插入即可(节点满,则分裂)。
(3)B树中,所有的数据只存储了一份;而B+树,除了存储了所有数据的叶子节点外,还要在内节点存储了键值。所以,在空间占用方面,B+树会比B树多些。
(4)在一个表中,聚族索引占用的空间肯定是最大的,因为它存储了全部数据,而二级索引是建立在某几个经常查询的列上(还有用来“回表”的指针),所以,二级索引的占用空间都会比聚族索引小很多。
索引设计原则
(1)MySQL 表主键设计
INNODB 以主键排序存储;聚集索引只能是主键;存储所有数据;二级索引包含主键键值。
如果表没有定义主键,会选择第一个唯一索引(非空)作为聚集索引主键。如果唯一索引也没有,MySQL后台会自动生成RowID。
字符类型字段最好不要做主键;常见的主键有两种:自增列和UUID。
自增: 顺序存储,索引维护成本低,索引效率高;
UUID:非顺序增长,随机IO严重。
(2)索引并不是越多越好,要根据查询,有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是使用了索引还是全表扫描;
(3)应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描;
(4)值分布很稀少的字段不适合建索引,例如“性别”这种只有两三个值的字段;
(5)不用外键,由程序保证约束;
(6)尽量不用UNIQUE,由程序保证约束;
(7)使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引。
(8)排序时,排序字段需要注意index, 尤其是关联查询排序时,尽可能使用小表的字段进行排序
SQL 优化 原则
(1)避免属性隐试转换 , 如定义Moblie varchar where Moblie =198989888会导致全表扫描;
(2)Where子句中条件字段本身避免使用函数;
(3)使用获取的必要字段代替SELECT *;
(4)批量插入,使用INSERT INTO table (col1,col2,...) VALUES (value1, value2,...),(value1, value2,...); 插入多条数据只有一次提交;
(5)避免使用长事务;
(6)禁止负向查询: NOT、!=、<>、!<、!>、NOT IN、NOT LIKE,会导致全表扫描;
(7)大表之间的join,尽量缩小结果集之后再join,否则会消耗较多的内存和CPU;
(8)搜索严禁左模糊或者全模糊(like %XX, 或like %XX%),会导致全表扫描。
MySQL索引设计需要考虑哪些因素?的更多相关文章
- MySQL 索引设计概要
		
在关系型数据库中设计索引其实并不是复杂的事情,很多开发者都觉得设计索引能够提升数据库的性能,相关的知识一定非常复杂. 然而这种想法是不正确的,索引其实并不是一个多么高深莫测的东西,只要我们掌握一定的方 ...
 - mysql索引设计的注意事项
		
mysql索引设计的注意事项 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过key_len确定究竟使用 ...
 - mysql索引设计的注意事项(大量示例,收藏再看)
		
mysql索引设计的注意事项(大量示例,收藏再看) 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过ke ...
 - 深入浅出分析MySQL索引设计背后的数据结构
		
在我们公司的DB规范中,明确规定: 1.建表语句必须明确指定主键 2.无特殊情况,主键必须单调递增 对于这项规定,很多研发小伙伴不理解.本文就来深入简出地分析MySQL索引设计背后的数据结构和算法,从 ...
 - mysql索引设计
		
mysql索引设计 1.B树与B+树的区别?B-Tree:一个节点可以拥有大于2个子节点的平衡多叉树,所有关键字在整颗树中出现,包括在非叶子节点也能命中, 叶子节点之间没有链表B+Tree:每个叶子节 ...
 - MySQL索引设计不可忽视的知识点
		
本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...
 - 【转】Mysql索引设计原则
		
来源:https://segmentfault.com/a/1190000000473085 假设一高频查询如下SELECT * FROM user WHERE area='amoy' AND sex ...
 - 阿里面试:MySQL如何设计索引更高效?
		
有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...
 - MySQL 索引性能分析概要
		
上一篇文章 MySQL 索引设计概要 介绍了影响索引设计的几大因素,包括过滤因子.索引片的宽窄与大小以及匹配列和过滤列.在文章的后半部分介绍了 数据库索引设计与优化 一书中,理想的三星索引的设计流程和 ...
 
随机推荐
- [Swift]LeetCode434. 字符串中的单词数 | Number of Segments in a String
			
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
 - [Swift]LeetCode893. 特殊等价字符串组 | Groups of Special-Equivalent Strings
			
You are given an array A of strings. Two strings S and T are special-equivalent if after any number ...
 - This relative module was not found:
			
晚上项目敲完,关机睡觉! 早上醒来-----打开项目,惊呆了 !This relative module was not found: 如图 这个报错,我当时怎么也没看懂!!! 后来经过测试 ...
 - Underscore.js 源码学习笔记(下)
			
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
 - [Abp 源码分析]十四、DTO 自动验证
			
0.简介 在平时开发 API 接口的时候需要对前端传入的参数进行校验之后才能进入业务逻辑进行处理,否则一旦前端传入一些非法/无效数据到 API 当中,轻则导致程序报错,重则导致整个业务流程出现问题. ...
 - jupyter-notebook后home页面空白问题
			
jupyter-notebook后home页面空白问题 解决方案1 更换默认的浏览器,选择谷歌浏览器,很多360打不开的页面,更换谷歌后都能有效解决,并且确保是最新版本的google浏览器. 解决 ...
 - Python内置函数(56)——set
			
英文文档: class set([iterable]) Return a new set object, optionally with elements taken from iterable. s ...
 - 关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置
			
关于pycharm安装出现的interpreter field is empty(解释器为空) 关于pycharm安装出现的interpreter field is empty,无法创建项目存储的位置 ...
 - ThreadPoolExecutor线程池任务执行失败的时候会怎样
			
接上一篇 <JDK1.8中的线程池> 1. 任务执行失败时的处理逻辑 1.1. Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread ...
 - 使用Redmine的PHP API时,如何判断需求是否为原子需求
			
使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...