加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

数据库两大必备神器:索引和锁底层道理是什么!

发布时间:2018-10-16 17:30:13 所属栏目:编程 来源:Java3y
导读:【51CTO技能沙龙】10月27日,让我们配合试探AI场景化应用实现之道 一、索引 在之前,我对索引有以下的认知: 索引可以加速数据库的检索速率; 表常常举办INSERT/UPDATE/DELETE操纵就不要成立索引了,换言之:索引会低落插入、删除、修改等维护使命的速率;

非聚积索引在成立的时辰也未必是单列的,可以多个列来建设索引。

  •  此时就涉及到了哪个列会走索引,哪个列不走索引的题目了(最左匹配原则-->后头有说)
  •  建设多个单列(非聚积)索引的时辰,会天生多个索引树(以是过多建设索引会占用磁盘空间)

数据库两大必备神器:索引和锁底层道理是什么!

在建设多列索引中也涉及到了一种非凡的索引-->包围索引

  •  我们前面知道了,假如不是聚积索引,叶子节点存储的是主键+列值
  •  最终照旧要“回表”,也就是要通过主键再查找一次。这样就会较量慢
  •  包围索引就是把要查询出的列和索引是对应的,不做回表操纵!

好比说:

  •  此刻我建设了索引(username,age),在查询数据的时辰:select username , age from user where username = 'Java3y' and age = 20。
  • 很明明地知道,我们上边的查询是走索引的,而且,要查询出的列在叶子节点都存在!以是,就不消回表了~

  •  以是,能行使包围索引就只管行使吧~

7、索引最左匹配原则

最左匹配原则:

  •  索引可以简朴如一个列(a),也可以伟大如多个列(a, b, c, d),即连系索引。
  •  假如是连系索引,那么key也由多个列构成,同时,索引只能用于查找key是否存在(相称),碰着范畴查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。
  •  因此,列的分列次序抉择了可掷中索引的列数。

例子:

  •  若有索引(a, b, c, d),查询前提a = 1 and b = 2 and c > 3 and d = 4,则会在每个节点依次掷中a、b、c,无法掷中d。(很简朴:索引掷中只能是相称的环境,不能是范畴匹配)

8、=、in自动优化次序

不必要思量=、in等的次序,mysql会自动优化这些前提的次序,以匹配尽也许多的索引列。

例子:

  •  若有索引(a, b, c, d),查询前提c > 3 and b = 2 and a = 1 and d < 4与a = 1 and c > 3 and b = 2 and d < 4等次序都是可以的,MySQL会自动优化为a = 1 and b = 2 and c > 3 and d < 4,依次掷中a、b、c。

9、索引总结

索引在数据库中是一个很是重要的常识点!上面谈的着实就是索引最根基的对象,要建设出好的索引要顾及到许多的方面:

  1,最左前缀匹配原则。这长短常重要、很是重要、很是重要(重要的工作说三遍)的原则,MySQL会一向向右匹配直到碰着范畴查询(>,<,BETWEEN,LIKE)就遏制匹配。

  3,只管选择区分度高的列作为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。暗示字段不一再的比率,比率越大我们扫描的记录数就越少。

  4,索引列不能参加计较,只管保持列“干净”。好比,FROM_UNIXTIME(create_time) = '2016-06-06' 就不能行使索引,缘故起因很简朴,B+树中存储的都是数据表中的字段值,可是举办检索时,必要把全部元素都应用函数才气较量,显然这样的价钱太大。以是语句要写成 : create_time = UNIX_TIMESTAMP('2016-06-06')。

  5,尽也许的扩展索引,不要新成立索引。好比表中已经有了a的索引,此刻要加(a,b)的索引,那么只必要修改原本的索引即可。

  6,单个多列组合索引和多个单列索引的检索查询结果差异,由于在执行SQL时,MySQL只能行使一个索引,会从多个单列索引中选择一个限定最为严酷的索引。

二、锁

数据库两大必备神器:索引和锁底层道理是什么!

在mysql中的锁看起来是很伟大的,由于有一大堆的对象和名词:排它锁,共享锁,表锁,页锁,间隙锁,意向排它锁,意向共享锁,行锁,读锁,写锁,乐观锁,气馁锁,死锁。这些名词有的博客又直接写锁的英文的简写--->X锁,S锁,IS锁,IX锁,MMVC...

锁的相干常识又跟存储引擎,索引,事宜的断绝级别都是关联的....

这就给初学数据库锁的人带来不少的贫困~~~于是我下面就简朴清算一下数据库锁的常识点,但愿各人看完会有所辅佐。

1、为什么必要进修数据库锁常识

不少人在开拓的时辰,应该很少会留意到这些锁的题目,也很少会给措施加锁(除了库存这些对数目精确性要求极高的环境下)

一样平常也就听过常说的乐观锁和气馁锁,相识过根基的寄义之后就没了~~~

放心丸:纵然我们不会这些锁常识,我们的措施在一样平常环境下照旧可以跑得好好的。由于这些锁数据库隐式帮我们加了:

  •  对付UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
  • MyISAM在执行查询语句SELECT前,会自动给涉及的全部表加读锁,在执行更新操纵(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个进程并不必要用户过问;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读