欢迎来真孝善网,为您提供真孝善正能量书籍故事!

MySQL 索引全面解析

时间:11-07 现代故事 提交错误

大家好,关于MySQL 索引全面解析很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

对于InnoDB,每个InnoDB表都有一个特殊的索引,称为聚集索引。如果表上定义了主键,则主键索引就是聚集索引。如果你没有将其定义为你的表的主键,MySQL会采用第一个唯一索引是唯一的,并且只包含非空列(NOT NULL)作为主键。 InnoDB 使用它作为聚集索引。如果没有这样的列,InnoDB会自己生成这样的ID值。它留下一个字节并被隐藏。使其成为聚集索引。

根据数据的功能,可以在数据库设计器中创建三种类型的索引:唯一索引、主键索引和聚集索引。

唯一的问题是索引不允许任何两行具有相同的索引值

主键索引数据库表通常有一列或列的组合,其值唯一标识表中的每一行。该列称为表的主键。为数据库图中的表定义主键会自动创建主键索引,这是一种特定类型的唯一索引。索引要求主键中的每个值都是唯一的。

聚集索引在聚集索引中,表中行的物理顺序与键值的逻辑顺序相同。一张表只能包含一个聚集索引。

局部性原理与磁盘预读

由于存储介质的特性,磁盘本身的访问速度比主存慢很多。再加上机械机芯的成本,磁盘的存取速度往往是主存的百分之几甚至六千倍。因此,为了提高效率,要尽可能减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次读取时都会提前读取。即使只需要一个字节,磁盘也会从这个位置开始,按顺序向后进行。读取一定长度的数据并将其存储到内存中。其理论基础是计算机科学中最著名的局部性原理,即当使用一个数据时,它附近的数据通常也会被使用。程序执行过程中所需的数据通常比较集中。

由于磁盘顺序读取非常高效(无寻道时间,旋转时间极少),因此预读可以提高具有局部性的程序的I/O 效率

预读的长度一般是页的整数倍。页是计算机管理的内存的逻辑块。硬件和操作系统通常将主存和磁盘存储区域划分为大小相等的连续块。每个存储块称为页(在许多操作系统中,页大小通常为4K ),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,就会触发缺页异常,因此系统会向磁盘发送读盘信号,磁盘会找到数据的起始位置并继续向后移动一页或几页内存。则返回异常,程序继续运行。

B-/+ Tree 索引的性能分析

如上所述,一般用磁盘I/O数来评价索引结构的好坏。我们先来分析一下B-TREE。根据B-Tree的定义,可以看出一次检索最多需要访问h个节点。数据库系统的设计者巧妙地利用磁盘和读写原理,将节点的大小设置为一页,这样每个节点只需要一次I/O就可以满载。为了达到这个目的,在实际实现中B-Tree还需要用到以下技术:

每次创建新节点时,直接申请一页空间。这确保节点物理存储在页面中。此外,计算机存储分配是页对齐的,这意味着一个节点只需要一次I/O。

B-Tree 中的一次检索最多需要h-1 个I/O(根节点驻留在内存中),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是一个很大的数,通常大于100,因此h很小(通常不超过3)。

对于像红黑树这样的结构,h 显然要深得多。由于逻辑上接近的节点(父节点和子节点)可能物理上相距较远,无法利用局部性,因此红黑树的I/O渐近复杂度也是O(h),效率明显比B 树。

3.数据库结构优化

1)范式优化:比如消除冗余(节省空间……) 2)反范式优化:比如适当增加冗余(减少join) 3)分表:对数据进行物理上的分区,不同分区的数据可以存储在不同磁盘上的单独数据文件中。这样,查询这张表时,只需要扫描表分区,而不需要扫描整个表,大大缩短了查询时间。另外,不同磁盘上的分区也会将这张表的数据传输分散在不同的地方。磁盘I/O,精心配置的分区可以均匀分散数据传输和磁盘I/O之间的竞争。此方法可用于具有大量数据的时间表。表分区可以按月自动创建。

4)拆分其实分为垂直拆分和水平拆分: 案例:一个简单的购物系统,暂时涉及到如下表: 1.商品表(数据量:10万,稳定) 2.订单表(数据量:200万,有呈增长趋势) 3、用户表(数据量:100万,呈增长趋势) 下面以mysql为例,介绍一下水平拆分和垂直拆分。 mysql能容忍的数量级从百万级静态数据到千万级垂直分割: 解决问题:表之间的io竞争没有解决问题:a中数据量增加带来的压力单表。解决方案:将产品表和用户表放在一台服务器上。将订单表单独放在服务器上。水平拆分:解决问题:单表表数据量增加带来的压力,没有解决问题:表间io争用

解决方案:将用户表按照性别拆分为男性用户表和女性用户表。订单表通过已完成和已完成分为已完成订单和未完成订单。产品表为未完成订单。将完成的订单表框放在男性用户的服务器上。女性用户的桌子放在服务器上(女人都爱购物哈哈)

b+指数原则

在B+索引树中,非叶子节点由索引元素和指向子节点的指针组成。它们的作用是寻找叶子节点,因为只有叶子节点才包含最终要找到的数据信息。从图中可以看出,节点中指针的数量比索引元素的数量多1。在叶子节点中,因为没有子节点,所以多出来的指针指向下一个叶子节点,这样所有的叶子节点都是串联起来的,这对于Range搜索很有用。在实际应用中,节点的大小是固定的,通常等于磁盘上一个页面的大小。这样访问一个节点只需要一次磁盘IO。一般一个节点可以存储数百个元素,因此索引百万数据b+树高不会超过3。

搜索类似于二叉搜索树,从根节点开始,自上而下遍历到叶节点,通常使用二分搜索来确定节点内的位置。

innodb本身存储的数据就是主键b+tree索引,因为索引内存存储的是真正的数据。

InnoDB支持事务、外键、mvcc、行锁等更先进的引擎技术。

主键必须是唯一的,但不同的是它不能为空。而且一张表只能有一个主键。很多人认为主键是唯一索引的一种,但其实这是不准确的。主键也可以是组合索引,只要组合的每个结果都是唯一的,这在某些场景下非常实用。例如,多对多关系的数据透视表就非常适合使用复合主键。下图是用户权限功能的典型实现。用户和角色、角色和权限都是多对多的关系。主枢纽表记录了它们之间的对应关系,而且这些关系是唯一的,所以这对于数据透视表来说非常适合使用复合主键。

选择区分度高的列作为索引

区分度:count(distinct col)/count(*),区分度是0到1之间的小数,越接近1区分度越高。

MySQL创建索引的基本原则:

http://www.toutiao.com/a6427416564824064257/?tt_from=weixinutm_campaign=client_shareapp=news_articleutm_source=weixiniid=10861926112utm_medium=toutiao_ioswxshare_count=1

1. 不要在低基数列上创建索引。浪费索引存储空间,并不能提高查询效率。

2、尽量不要在频繁修改的子段上创建索引,这样会增加插入的成本,增加死锁的概率。

3.删除冗余索引。必须删除所有未使用的索引,以避免不必要的空间浪费。 url 索引在这个例子中没有用。

4.不要创建太多索引,因为插入数据时,索引也需要插入。索引太多会导致插入性能差

5. 不要在非空列上创建索引。如果该值为空,建议将其替换为常量,例如1或-1。

6、如果查询是多个条件,不要为每个条件创建索引,而是创建复合索引,因为MySQL只使用1个索引。

7、创建复合索引,注意左匹配原则,并考虑复用性。例如,创建复合索引index(a,b,c)相当于同时创建索引(a)、索引(a,b)、索引(a,b,c)。

8、创建复合索引时,需要注意将最大的索引放在前面。

9、最好使用自增主键,保证数据连续性(mysql innodb主键默认使用b+tree,索引和数据放在同一棵树上)。不要使用uuid、hash、md5等。

10、少用外键,会导致两个表的数据变化互相影响。尝试通过商业来实现它。

11、不要使用预匹配的like查询,这会导致索引失败。您可以使用“xxxx%”等后匹配

12. 在字符串上创建索引并尝试使用前缀索引。前缀技术根据具体业务,在匹配度和存储量(索引存储量)之间取得平衡。

13. 不要在like中使用not,否则会导致索引失败。 not in 可以替换为not in 或不存在。最好在in 和or 所在的列中建立索引。

MySQL 索引全面解析和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

用户评论

念初

刚看到这个标题就感觉很实用!

    有12位网友表示赞同!

抚涟i

学习MySQL真的少不了了解索引啊,这样查询速度就能更快了。

    有9位网友表示赞同!

别悲哀

希望这篇文章能详细介绍不同类型的索引,例如B树索引、HASH索引等等。

    有9位网友表示赞同!

君临臣

我也一直在努力优化数据库查询速度,索引知识真的是非常宝贵。

    有9位网友表示赞同!

箜篌引

MySQL的索引总结确实是一篇很好的学习资源。

    有14位网友表示赞同!

墨染年华

看完这篇文章我感觉自己对索引的理解又更深一层了。

    有20位网友表示赞同!

失心疯i

以前总是觉得索引是个黑魔法,现在终于想看懂它是怎么运作的了。

    有10位网友表示赞同!

挽手余生ら

学习数据库知识真是很需要耐心,不过掌握这些技能真的非常有价值。

    有14位网友表示赞同!

暖瞳

我需要好好复习一下MySQL的索引类型和使用场景。

    有15位网友表示赞同!

我绝版了i

数据库优化是一个不断探索的过程,索引也是其中重要的一环。

    有14位网友表示赞同!

命硬

这篇文章能让我更好地理解如何选择合适的索引类型?

    有16位网友表示赞同!

我一个人

希望能看到一些实际案例,展示如何用索引来提高MySQL查询效率。

    有9位网友表示赞同!

龙卷风卷走爱情

学习MySQL索引的同时也要注意权衡成本收益关系。

    有20位网友表示赞同!

初阳

总结文章比较简洁明了,方便快速掌握核心知识点。

    有9位网友表示赞同!

万象皆为过客

期待作者能分享更多MySQL的优化技巧!

    有10位网友表示赞同!

回忆未来

对于初学者来说,这篇文章可以作为入门指南很好的选择。

    有14位网友表示赞同!

执念,爱

学习索引不仅是为了提升数据库性能,更是为了写出更高效的代码。

    有15位网友表示赞同!

〆mè村姑

感觉MySQL索引总结非常全面,涵盖了大部分需要了解的知识点。

    有7位网友表示赞同!

あ浅浅の嘚僾

我很期待阅读这篇文章!

    有10位网友表示赞同!

青衫故人

对数据库优化越来越感兴趣,索引学习真是必不可少的环节。

    有20位网友表示赞同!

【MySQL 索引全面解析】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

免责声明:部分作品来自网友发布,或收集于互联网,目的在于更好的传递 好内容 ,正能量内容。如果侵犯了您的权益,或者您不想在本站发布,请及时联系我们,我们第一时间删除信息!