Mysql(一)Schema 数据类型优化 和索引基础

前言

文本已收录至个人GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是如今
我知道不少人不玩qq了,可是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励你们在技术的路上写博客mysql

絮叨

为啥要讲Mysql呢?由于这个在面试也问得比较多,并且本身不少时候写代码用到mysql的时候,也没有太过于注意一些东西,而后我想着把mysql的东西 好好整理一下,哈哈。而后慢慢来吧,从最基础的开始,这个系列也是不中止系列。写到哪算到哪 博主从学了mysql以后一直没有系统的学习过mysql 此次为了啃他 准备了git

  • 掘金小册的 从根儿上理解mysql
    说实话这个确实很牛逼,基本上看第一遍的时候我都特么以为彻底看不懂,看第二遍才能稍微明白,这种文章适合反复看,像我这个小白,唉,只能说菜的扣脚。
  • mysql 45讲

难度比上面的小点。

  • 高性能mysql

技术总监点名要学习的,还不错。

  • 深刻浅出mysql

其实我写博客,也就是记录本身的学习过程,其实我是以为本身仍是很菜的,在技术的路上 还处在 看山是山 的境界吗,但愿2年后看到本身写的文章,内心会冒出一句,这是哪一个shabi写的东西,哈哈,这说明,我这2年当中有进步嘛,好啦,你们一块儿来跟我系统的学习学习mysql吧。github

后续文章默认你们会简单的crud,而且会用SQL语言,若是你连SELECT、INSERT这些单词都没据说过。那你得去学学基础了。(固然写博客的时候,博主也是这个水平的,因此我写出来的文章可能水平不高,可是确定真实,由于我和你们同样是慢慢学得)面试

Schema 和 数据类型优化

良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句设计schema,这个须要本身好好权衡利弊。例如,反范式能够加快查询速度,可是同时也会使另外1一些查询变慢。因此下面就介绍一些实用的经验,数据库类型的优化。算法

  • 设计正确存储数据的最小数据类型,更小的数据一般更快,由于它们占用更少的磁盘,内存。和CPU
  • 尽可能避免NULL,一般状况下最好指定为NOT NULL,除非真的须要存储NULL。由于可为NUll的列须要更多的存储空间,在记录索引的时候,可为NUll的列须要多一个字节(后面文章会细细道来)
  • 对于时间类型的选择 DATETIME 和TIMESTAMP它们均可以存储相同的时间类型,可是TIMESTAMP只使用DATETIME一半的存储空间。因此尽可能选择TIMESTAMP (而且它的默认值是不为NULL)
  • char 和varchar 这个得看本身业务需求了,若是你肯定你得字段的大小是百分之一百的,那你确定是用char,若是不肯定你就得用varchar 而且就是预估本身这个类型的长度。
  • 对于bit 是不建议用的,好比说咱们业务中须要标识是否删除,是否上架这种类型的(只有2种状况的,也是建议使用tinyint来标识。
  • 尽可能使用相同的数据类型存储类似或者相关的值,尤为是要在关联查询中使用的列
  • 当心使用ENUM,虽然他们很好用。可是不要滥用。
  • 尽可能作到避免过分设计,例如会致使及其复杂的查询schema设计,或者有不少列的表设计。

范式是好的,可是反范式有时也是必须的,作过微服务开发的都知道,有时候咱们冗余一些字段,能够为咱们的业务带来更快的查询,可是咱们更新的时候,就必需要多维护多一张表,因此对于咱们读多写少的场景,我以为冗余多一个字段也是没有问题的。对于范式和反范式的混用,得看具体的业务,仁者见仁,智者见智。通过你们多年来的实践经验得来的才是最真实的sql

索引基础

什么是索引数据库

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的做用至关于图书的目录,能够根据目录中的页码快速找到所需的内容。数组

Tips数据结构

最近在作sql优化,其实sql咱们作sql优化的时候第一步想到确定是加索引,好比某一个 SQL 查询比较 慢,分析完缘由以后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是 索引,索引又是如何工做的呢?数据结构和算法

常见的索引类型

索引的出现是为了提升查询效率,可是实现索引的方式却有不少种,因此这里也就引入了索引模 型的概念。能够用于提升读写效率的数据结构不少,这里我先给你介绍三种常见、也比较简单的 数据结构,它们分别是哈希表、有序数组和搜索树。

哈希表

其实这个能够直接对比Java的HashMap,还算是比较简单 底层实现能够是数组+链表的这种数据结构,哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换 算成一个肯定的位置,而后把 value 放在数组的这个位置。 不可避免地,多个 key 值通过哈希函数的换算,会出现同一个值的状况。处理这种状况的一种 方法是,拉出一个链表。

哈希表的特色就是能够快速的精确查询,可是不支持范围查询。它适用于等值查询的地方

有序数组

有序数组在等值查询和范围查询场景中的性能就都很是优秀 ,可是不合适更新,由于更新的时候就很是的耗费时间了,因此这种数据结构只能适合静态数据,你好比你大学四楼泡的妹子。哈哈已经这个是永远也不会改变的。有就是有,没有就算没有。。。

搜索树

搜索数结构,还算蛮多的

  • 二叉数
    • 它的话,搜索效率仍是不错的,可是他的时间复杂度是O(log(N)),为了维持这个时间复杂度,更新的时间复杂度也得是O(log(N)),那就得保持这棵树是彻底平衡二叉树了。
  • 平衡二叉树
    • 这个也是同样的,它的树高会很高,因此也不是那么适合作mysql的存储结构
  • B数
    • B树中的一个节点能够存储多个元素。
  • B+数
    • B+树是B树的升级版,只是把非叶子节点冗余一下,这么作的好处是为了提升范围查找的效率。

N 叉树因为在读写上的性能优势,以及适配磁盘的访问模式,已经被普遍应用在数据库引擎中了。数据库底层存储的核心就是基于这些数据模型的。每碰到一个新数据库,咱们须要先关注它的数据模型,这样才能从理论上分析出这个数据库的适用场景。 对于数据结构和算法这门课,到时候我确定也得过一下的这些才是软件工程的基础嘛。这里就不一一细说了。

结尾

今天就稍微介绍了一下下哈。咱们下章继续再战,对了若是须要mysql上面这几样学习质料的话,能够加qq群下载,你们一块儿从小白开始学mysql,群里还蛮好玩的,对于初学着来讲,由于咱们不是大神,都是小白,相互学习。

平常求赞

好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是真粉

创做不易,各位的支持和承认,就是我创做的最大动力,咱们下篇文章见

六脉神剑 | 文 【原创】若是本篇博客有任何错误,请批评指教,不胜感激 !

相关文章
相关标签/搜索