互联网业务往往使用MySQL数据库作为后台存储,存储引擎使用InnoDB。我们针对互联网自身业务特点及MySQL数据库特性,讲述在具体业务场景中如何设计表和分表。本文从介绍MySQL相关基础架构设计入手,并结合企业实际案例介绍分表和索引的设计实战技巧。
5G时代,业务数据越来越丰富,业务使用MySQL数据库作为后台存储,存储引擎使用InnoDB,会带来哪些挑战?如何针对公司业务特点及MySQL数据库特性,制定若干数据库使用规范供一线RD在设计业务时参考部分内容要求强制执行。本文从介绍MySQL相关关键基础架构,并结合实际案例介绍表和索引的设计技巧,并对规范中重点内容做详细解读。
在 InnoDB 中如果没有定义主键,会选择第一个非空唯一索引来代替。如果没有这样的索引,InnoDB 会自动生成一个不可见的列名为 ROW_ID,索引名为 GEN_CLUST_INDEX 的聚簇索引,该列是一个 6 字节的自增数值,随着插入而自增。
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过索引,可以让数据库不必全表扫描,直接快速访问到符合条件的记录,大大加快了查询速度。
MySQL索引详解 一. 索引简介 索引:帮助MySQL高效查询数据的一种有序的数据结构。 如果没有索引,查询某行数据,只能进行全表扫描。这时,需要频繁地进行磁盘I/O,性能很差。索引的基本思想,就
索引类似书本的目录,查询书中的指定内容时,先在目录上查找,之后可快速定位到内容位置。在数据库中通常通过 B 树 / B + 树数据结构实现。
建立索引也有缺点,在对表进行INSERT、UPDATE、DELETE时要维护索引文件,经常更新的表就不需要建立索引了
标志这个sql语句被分为几个(行数)独立的sql执行,执行顺序依照(1)从大到小(2)从上到下 依次排列执行
在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引。
简单来说,索引的出现是为了提高查询效率,就像书的目录一样。MySQL 的索引是在「存储引擎」层实现的,因此没有统一的标准,同一种类型的索引,在不同存储引擎之间实现可能也不同。本文主要分析 InnoDB 存储引擎的索引结构。
面试中,MySQL 索引相关的问题基本都是一系列问题,都是先从索引的基本原理,再到索引的使用场景,比如:
大家是不是感觉弱爆了,随着工作经验的增加,我对索引有了更深入的了解,下面就来分享下我眼中的索引,分享以问题的形式,从敲门到进门。
在数据查询中,大多数情况都需要使用索引来加速数据的查找,而索引本身是一种数据存储的结构,通过特殊的数据的存储结果来对应数据的访问的算法,本身索引的高效率 = 算法 + 数据存储的方法 , 缺一不可,所以不同的索引页需要不同的数据存储的组织方式,这里统称为索引的类型。
1.索引的作用:提高数据查询效率 2.常见索引模型:哈希表、有序数组、搜索树 3.哈希表:键 – 值(key – value)。 4.哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置 5.哈希冲突的处理办法:链表 6.哈希表适用场景:只有等值查询的场景 7.有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N)) 8.有序数组查询效率高,更新效率低 9.有序数组的适用场景:静态存储引擎。 10.二叉搜索树:每个节点的左儿子小于父节点,父节点又小于右儿子 11.二叉搜索树:查询时间复杂度O(log(N)),更新时间复杂度O(log(N)) 12.数据库存储大多不适用二叉树,因为树高过高,会适用N叉树 13.InnoDB中的索引模型:B+Tree 14.索引类型:主键索引、非主键索引 主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引) 15.主键索引和普通索引的区别:主键索引只要搜索ID这个B+Tree即可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表) 16.一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。 17.从性能和存储空间方面考量,自增主键往往是更合理的选择。 思考题: 如果删除,新建主键索引,会同时去修改普通索引对应的主键索引,性能消耗比较大。 删除重建普通索引貌似影响不大,不过要注意在业务低谷期操作,避免影响业务.
mysql索引真的是一个让人不得不说的话题,这个东西你在面试中会用到,在实际的工作中也会用到,这更是一个专业的DBA所必须掌握的内容,它的重要性体你在大厂的面试题汇总也可以看到,属于必问的一个内容。
(2).非聚簇索引 联合索引 前缀索引 普通索引 唯一索引 全文索引
这里是为后续的mysql调优做准备,要像做到mysql调优,索引很关键,理解索引结构,页结构,对于调优来说是很重要的基础。
小伙伴们在面试的时候,有一个特别常见的问题,那就是数据库的回表。什么是回表?为什么需要回表?
提到数据库索引大家肯定不陌生,那到底什么是索引呢,索引是怎么工作的呢,今天就一起来聊聊这个话题 索引的出现就是为了解决数据库查询的效率问题,就像平时我们看书一样,想要找某个详细的内容,就先通过目录去找到大概的地方,再找具体的内容,索引就是数据库中的“目录” 下面我们进入今天的正题,索引数据结构的类型
count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数
辅助记忆,诗曰: 全值匹配我最爱, 最左前缀要遵守; 带头大哥不能死, 中间兄弟不能断; 索引列上少计算, 范围之后全失效; 模糊百分写最右, 覆盖索引不写星; 不等空值还有或, 索引失效要少用; 字符引号不可丢, 牢记以上就无忧。
MySQL 中的数据同样也是根据索引分类,通过索引可以快速高效的查询到我们想要的数据。
索引的概念基本所有人都会遇到过,就算没有了解过数据库中的索引,在生活中也不可避免的接触到。比方说书籍的目录,字典的查询页,图书馆的科目检索等等。其实这些都是一种索引,并且所起到的作用大同小异。
首先看一下,在数据库没有加索引的情况下,SQL中的where语句是如何查找目标记录的,首先看到下图的Col2字段,如果我们要查找where col2 = 89的记录,我们在没有加索引的情况下,数据库默认会从上往下按顺序查找记录,那么将会查找5次才能查到数据,如果对Col2字段加上索引之后,假设使用最简单的二叉树作为索引存储,那么带条件查询的话,就只需要查询2次即可查到了,效率有明显的提升
聚簇索引 索引和数据存储在一块( 都存储在同一个B*tree 中)。 一般主键索引都是聚餐索引 Mysql中InnoDB引擎的主键索引为聚簇索引,MyISAM存储引擎采用非聚集索引 非聚簇索引 索引数据和存储数据是分离的。 二级索引(辅助索引) 二级索引存储的是记录的主键,而不是数据存储的地址。 以Mysql的InnoDB为例 主键是聚集索引 唯一索引、普通索引、前缀索引等都是二级索引(辅助索引) 示例 下面我们通过一个具体的示例进行演示聚集索引和二级索引 pl_ranking(编程语言排行榜表
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
如果使用覆盖索引就可以不回表扫描。 索引类型:InnoDB引擎,默认B+树(O(logN))、Hash索引 B树索引 O(1)
数据库范式 目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。 范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦,但是操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。要权衡是否使用更高范式是比较麻烦的,一般在项目中,用得最多的也就是第三范式,我认为使用到第三范式也就足够了,性能好而且方便管理数据。 第一范式:对于表中
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找 树来说,查找效率更稳定,总体的查找速度也更快。
同学B:因为索引其实就是一种优化查询的数据结构,比如Mysql中的索引是用B+树实现的,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,所以能优化查询。
在我们实际开发中,随着业务的不断增加,数据量也在不断的攀升,这样就离不开一个问题:数据查询效率优化 根据自己的以往实际项目工作经验和学习所知,现在对SQL查询优化做一个简单的梳理总结,总结的不好之处,望多多指点交流学习 主要通过以下几个点来进行总结分析:索引、语句本身、分区存储、分库分表
我们都知道当查询数据库变慢时,需要建索引去优化。但是只知道索引能优化显然是不够的,我们更应该知道索引的原理,因为不是加了索引就一定会提升性能。那么接下来就一起探索MYSQL索引的原理吧。
聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是数据库中的两种索引类型,它们在组织和存储数据时有不同的方式。
索引是存储引擎用于快速找到数据记录的一种数据结构。MySQL在进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则全表扫描,建索引目的就是为了减少磁盘I/O次数,加快查询效率。
上篇文章我们说了索引排序和排序注意事项,排序不要用复杂的函数,范围查找的时候,左边的列有索引效果,后面的列没有,除非指定特定值,like模糊查询时候,前面不要用%,asc desc不要混用。索引排序之所以快,因为b+树里面的双向链表和单向链表数据结构原本就是按索引从小到大排序好的,所以直接取出数据就好,不需要在磁盘和内存中排序。
索引是加速数据库查询的关键。在设计表结构时,应该根据查询的需求添加合适的索引。常用的索引包括主键、唯一索引、普通索引、联合索引、前缀索引(vachar、text这种长的数据并且只需要前几个区分度就很高)等。
提到数据库,大家肯定会想到数据库的索引,很多人都知道索引是为了提高查询效率的,那么今天我就给大家讲一下,什么是索引,索引的数据结构是什么,索引是如何工作的。
MySQL的基本存储结构是页,记录都存在页里面,下图以聚簇索引为例,页与页之间构成一个双向链表,每个页中的记录又组成一个单向链表,页里边将记录分组,将每组第一个记录的主键提取出来构成一个目录项,目录项是一个数组,叶子结点记录了实际的记录,而非叶子结点并不记录实际记录,只是记录了其孩子结点第一个记录的主键以及所在页号。
myisam引擎是5.1版本之前的默认引擎,⽀持全⽂检索、压缩、空间函数等,但是不⽀持事务和⾏级锁,所以⼀般⽤于有⼤量查询少量插⼊的场景来使⽤,⽽且myisam不⽀持外键,并且索引和数据是分开存储的。
1、因为任何有业务含义的列都有改变的可能性,主键一旦带上了业务含义,那么主键就有可能发生变更。主键一旦发生变更,该数据在磁盘上的存储位置就会发生变更,有可能会引发页分裂,产生空间碎片。
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。
学习MySQL的知识,学习好索引是非常重要的,索引分类、索引如何正确添加、索引失效的场景、底层数据结构等问题是面试中必问的,就这些内容我们一起学习巩固下。
领取专属 10元无门槛券
手把手带您无忧上云