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]LeetCode302. 包含黑色像素的最小矩形 $ Smallest Rectangle Enclosing Black Pixels
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...
- [Swift]LeetCode1002. 查找常用字符 | Find Common Characters
Given an array A of strings made only from lowercase letters, return a list of all characters that s ...
- linux-php5.6-安装sftp扩展
一. 更新gc库,添加libssh2库 yum -y install libstdc libgomp cpp gcc libgfortran libssh2 libssh2-devel gcc-gfo ...
- IdentityServer4之Implicit(隐式许可) —— oidc-client-js前后端分离
IdentityServer4之Implicit(隐式许可) —— oidc-client-js前后端分离 参考 官方文档:oidc-client-js:oidc-client是一个JavaScrip ...
- nodejs接收get参数和post参数
get请求用query //http://localhost:3000?a=3&b=4&c=5 router.get('/', function (req, res, next) { ...
- 【ASP.NET Core快速入门】(十)Cookie-based认证实现
准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController ...
- Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署
一.环境需求 本帖针对的是Linux环境,Windows或其他系统也可借鉴.具体只讲述Jenkins配置以及整个流程的实现. 1.JDK(或JRE)及Java环境变量配置,我用的是JDK1.8.0_1 ...
- SpringMVC集成rabbitmq:优化秒杀下单环节
前言 上一篇在springboot中基于自动配置集成了rabbitmq.那么回到最初的话题中就是想在秒杀下单环节增加排队机制,从而达到限流的目的. 优化秒杀下单流程 之前是在控制器里拿到客户端请求后直 ...
- 【Linux】Rsync的剖析与使用
目录 Rsync的工具剖析与使用 0.Rsync的介绍 1.Rsync的特性 2.Rsync的部署安装 3.搭建远程备份系统. Rsync的工具剖析与使用 0.Rsync的介绍 rsync是Linux ...
- PLSQL创建Oracle定时任务
在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 cr ...