精华内容
下载资源
问答
  • key的作用

    2018-08-24 16:49:54
    not null 与 default ... id int primary key auto_increment, 设置了主键 id,如果通过id查找就会大量减少IO时间 name varchar(16) not null, 不能为空 sex enum('male','female') not null default...

    not null 与 default

    create table t1(
            id int primary key auto_increment,   设置了主键 id,如果通过id查找就会大量减少IO时间
            name varchar(16) not null,  不能为空
            sex enum('male','female') not null default 'male' 不能为空且默认值为male
    );
    insert into t1(name) values('egon'),('lxx'),('alex');

    unique key:不能重复

    key的作用

    primary key: 不能重复且不能为空,还有键的功能

    站在约束角度看primary key=not null unique
    以后但凡建表,必须注意:
    1、必须有且只有一个主键
    2、通常是id字段被设置为主键
    create table t5(
    id int primary key auto_increment
    );

    存储引擎

    key的作用

    foreign key: 限制关联表某一个字段的值必须是来自于被关联表的一个字段

    1、被关联的字段必须是一个key,通常是id字段
    2、创建表时:必须先建立被关联的表,才能建立关联表

    1 被关联的字段必须是一个key,通常是id字段

    2 创建表时: 必须先建立被关联的表,才能建立关联表

    3 插入记录时: 必须先往被关联的表插入记录,才能往关联表中插入记录

    key的作用
    key的作用

    找两张表的关系的窍门

    key的作用
    key的作用

    一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录

    关于mysql的索引为什么使用的B+树而不是B树?

    (1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
    (2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

    B+树与B树的不同在于:
    (1)所有关键字存储在叶子节点,非叶子节点不存储真正的data
    (2)为所有叶子节点增加了一个链指针

    局部性原理与磁盘预读
    为了提升效率,要尽量减少磁盘IO的次数。实际过程中,磁盘并不是每次严格按需读取,而是每次都会预读。磁盘读取完需要的数据后,会按顺序再多读一部分数据到内存中,这样做的理论依据是计算机科学中注明的局部性原理:

    当一个数据被用到时,其附近的数据也通常会马上被使用
    程序运行期间所需要的数据通常比较集中

    (1)由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),
    因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。
    (2)MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K(这个值可以修改)。linux 默认页大小为4K。

    系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

    InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:

    mysql> show variables like 'innodb_page_size';

    转载于:https://blog.51cto.com/13764714/2164009

    展开全文
  • 要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。我们知道,vue和react都实现了一套虚拟DOM,使我们可以不直接操作DOM元素,只操作数据便可以重新渲染页面。而隐藏在背后的原理便是其高效的Dif...

    因为不理解 :key(v-bind:key),网上查了一些的资料,这篇写得非常不错,很简洁清楚。

    其实不只是vue,react中在执行列表渲染时也会要求给每个组件添加上key这个属性。

    要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。

    我们知道,vue和react都实现了一套虚拟DOM,使我们可以不直接操作DOM元素,只操作数据便可以重新渲染页面。而隐藏在背后的原理便是其高效的Diff算法。

    vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设:

    1. 两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。

    2. 同一层级的一组节点,他们可以通过唯一的id进行区分。

    基于以上这两点假设,使得虚拟DOM的Diff算法的复杂度从O(n^3)降到了O(n)。

    image

    当页面的数据发生变化时,Diff算法只会比较同一层级的节点:

    ** 如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点了。

    ** 如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新。

    当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。

    比如一下这个情况:

    image

    我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

    image

    即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

    所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

    image

    所以一句话,**key的作用主要是为了高效的更新虚拟DOM**。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,

    否则vue只会替换其内部属性而不会触发过渡效果。

    展开全文
  • vue key的作用

    2019-07-25 15:24:00
    key的作用是什么? 简单来说: key是给每一个vnode的唯一id,可以依靠key,更准确, 更快的拿到oldVnode中对应的vnode节点。 1. 更准确 因为带key就不是就地复用了,在sameNode函数a.key === b.key对比中可以...

    key的作用是什么?

    简单来说:

    key是给每一个vnode的唯一id,可以依靠key,更准确, 更的拿到oldVnode中对应的vnode节点。

    1. 更准确

    因为带key就不是就地复用了,在sameNode函数 a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。

    2. 更快

    利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。(这个观点,就是我最初的那个观点。从这个角度看,map会比遍历更快。)

    详解:

    部分讨论是基于没有key的情况diff速度会更快。确实,这种观点并没有错。没有绑定key的情况下,并且在遍历模板简单的情况下,会导致虚拟新旧节点对比更快,节点也会复用。而这种复用是就地复用,一种鸭子辩型的复用。以下为简单的例子:

    <div id="app">
        <div v-for="i in dataList">{{ i }}</div>
    </div>
    var vm = new Vue({
      el: '#app',
      data: {
        dataList: [1, 2, 3, 4, 5]
      }
    })

    以上的例子,v-for的内容会生成以下的dom节点数组,我们给每一个节点标记一个身份id:

      [
        '<div>1</div>', // id: A
        '<div>2</div>', // id:  B
        '<div>3</div>', // id:  C
        '<div>4</div>', // id:  D
        '<div>5</div>'  // id:  E
      ]
    1. 改变dataList数据,进行数据位置替换,对比改变后的数据
     vm.dataList = [4, 1, 3, 5, 2] // 数据位置替换
    
     // 没有key的情况, 节点位置不变,但是节点innerText内容更新了
      [
        '<div>4</div>', // id: A
        '<div>1</div>', // id:  B
        '<div>3</div>', // id:  C
        '<div>5</div>', // id:  D
        '<div>2</div>'  // id:  E
      ]
    
      // 有key的情况,dom节点位置进行了交换,但是内容没有更新
      // <div v-for="i in dataList" :key='i'>{{ i }}</div>
      [
        '<div>4</div>', // id: D
        '<div>1</div>', // id:  A
        '<div>3</div>', // id:  C
        '<div>5</div>', // id:  E
        '<div>2</div>'  // id:  B
      ]

    增删dataList列表项

      vm.dataList = [3, 4, 5, 6, 7] // 数据进行增删
    
      // 1. 没有key的情况, 节点位置不变,内容也更新了
      [
        '<div>3</div>', // id: A
        '<div>4</div>', // id:  B
        '<div>5</div>', // id:  C
        '<div>6</div>', // id:  D
        '<div>7</div>'  // id:  E
      ]
    
      // 2. 有key的情况, 节点删除了 A, B 节点,新增了 F, G 节点
      // <div v-for="i in dataList" :key='i'>{{ i }}</div>
      [
        '<div>3</div>', // id: C
        '<div>4</div>', // id:  D
        '<div>5</div>', // id:  E
        '<div>6</div>', // id:  F
        '<div>7</div>'  // id:  G
      ]

    从以上来看,不带有key,并且使用简单的模板,基于这个前提下,可以更有效的复用节点,diff速度来看也是不带key更加快速的,因为带key在增删节点上有耗时。这就是vue文档所说的默认模式。但是这个并不是key作用,而是没有key的情况下可以对节点就地复用,提高性能。

    这种模式会带来一些隐藏的副作用,比如可能不会产生过渡效果,或者在某些节点有绑定数据(表单)状态,会出现状态错位。VUE文档也说明了 这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

    在不带key的情况下,对于简单列表页渲染来说diff节点更快是没有错误的。但是这并不是key的作用呀。

    转载于:https://www.cnblogs.com/wangtong111/p/11244517.html

    展开全文
  • vue中key的作用

    2021-01-11 16:00:52
    本文结合源码说明了key的作用,给出了一个不写key的反例,并分析了原因。 内容 key的作用 不写key会出的bug及原因分析 key的实践方案 key的作用 在数据变化前后,vue会得到两个虚拟dom树,并依次...

    摘要

    本文结合源码说明了key的作用,给出了一个不写key的反例,并分析了原因。

    内容

    • key的作用

    • 不写key会出的bug及原因分析

    • key的实践方案

    key的作用

    在数据变化前后,vue会得到两个虚拟dom树,并依次比较两个虚拟dom树中哪些结点有变动,从而决定去做具体的更新。这里有一个操作要做:比较两个结点是不是同一结点,这个操作在源码是通过sameVnode来完成的。见如下代码。

     // https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.js
     function sameVnode (a, b) {
       return (
         a.key === b.key && (
          (
             a.tag === b.tag &&
             a.isComment === b.isComment &&
             isDef(a.data) === isDef(b.data) &&
             sameInputType(a, b)
          ) || (
             isTrue(a.isAsyncPlaceholder) &&
             a.asyncFactory === b.asyncFactory &&
             isUndef(b.asyncFactory.error)
          )
        )
      )
     }

    假设我们给一组元素中的每一项都设置了一个唯一的标识,则a.key===b.key就可以更快地返回结果,这就是提升性能的关键点。

    在实践中,渲染一组列表时,key往往是唯一标识(可能其它的条件是相同的),所以,如果不定义key,vue只能认为比较的两个节点是同一个 (undefined===undefined),哪怕它们实际上不是,这导致了频繁更新元素,使得整个patch过程比较低效,影响性能。有些特殊的时候甚至会有一些bug。

    bug来了

    下面这一段代码是硬编出来的,用它来说明如果在v-for循环中不写key,或者key没有正确使用会带来的后果。

     
     <div id="app" style="padding:20px">
       <coma v-for="(it,idx) in list" :i="idx" @click="d">{{it}}</coma>
     </div>
     
     <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script>
     <script>
       Vue.component('coma',{
         data() {
           return {
             v: Math.random()
          }
        },
         template: `
     <div @click="$emit('click',i)">
     <slot></slot>-<span>{{v}}</span> <button>点我删除</button>
       </div>
     `,
         props: ['i']
      })
       new Vue({
         el: "#app",
         data: {
           list: [1, 2,3,4,5]
        },
         methods: {
           d(idx) {
             this.list.splice(idx, 1)
          }
        }
      })
     </script>

    bug描述:当在某一项上点击删除时,它会删除最后一项,而不是删除当前项(请把注意力放在最后一项)。

    图片

     

    原因分析

    vue是通过虚拟dom来表示描述真实dom的,在去更新视图之前,要对前后两个虚拟dom树进行分析,以得出它们的区别。如果不设置key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。看官网 https://cn.vuejs.org/v2/api/#key

     

    分析一下上面bug, 以在第2项上点击为例。

    期待的情况,在点击前的数据:

     1,2,3

    在点击之后的数据

     1,3 // 第二项被删除了。

     

    但是由于没有设置key,此间产生的变化是:

    1. 把原来的第2项中的2改成3

    2. 把第3项删除掉。

    所以会导致序号异常,且最后一项被删除了。

    还有一个bug可以看这里https://codesandbox.io/s/vue-v-for-key-50x89。类似的情况还会发生在使用了v-transition时。

    推荐设置key

    可以通过如下的改进来避免上面的坑:

    1. 给列表中的数据项添加唯一的id

     data: {
        list: [{id:1,value:1},{id:2,value:3},{id:3,value:3}]
     },
    1. 修改视图

     <coma v-for="(it,idx) in list" :key="it.id" :i="idx" @click="d">{{it.value}}</coma>

    这样,在删除第二项时,vue会做出正确的判断:删除第二个组件。

    小结

    • key的作用主要是为了更高效的对比虚拟dom中的某个节点是不是相同节点,是用来提高diff算法的性能表现。更具体一点,vue在patch过程(执行diff的算法,可翻译为打补丁算法)中判断两个节点是否是相同节点,key值相同是一个必要条件。

    • key会提升效率。某些特殊情况下,不写key会出错。

    • 在使用v-for循环时,尽量避免直接使用数组的下标为key,因为它们在做删除操作时可能会导致渲染异常。

    • 最好是将key设成数据项中的主键:可以把一项与另一项区别开的值。

    展开全文
  • key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes。这篇文章主要给大家介绍Vue中key的作用,感兴趣的朋友跟随小编一起看看吧
  • Vue中key的作用

    2020-06-09 20:15:29
    Vue中key的作用 key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改、复用相同类型元素的算法,而使用key时,...
  • 要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。我们知道,vue和react都实现了一套虚拟DOM,使我们可以不直接操作DOM元素,只操作数据便可以重新渲染页面。而隐藏在背后的原理便是其高效的Diff算法。vue和...
  • rabbitmq的routingkey的作用

    千次阅读 2018-12-07 09:45:09
    rabbitmq的routingkey的作用: https://blog.csdn.net/weixin_38070406/article/details/82903677
  • vue 中 key 的作用

    2020-08-13 11:24:47
    vue 中 key 的作用 key 值:用于管理可复用的元素。因为 Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做使 Vue 变得非常快,但是这样也不总是符合实际需求。 2.2.0+ 的版本里,当在组件中...
  • vue 中 key的作用

    2020-09-16 14:52:33
    要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。 我们知道,vue和react都实现了一套虚拟DOM,使我们可以不直接操作DOM元素,只操作数据便可以重新渲染页面。而隐藏在背后的原理便是其高效的Diff算法 vue和...
  • vue——key的作用

    2019-08-22 14:21:54
    问题:新大新家用项目新增编辑家用项目模块根据条件显示省市区组件(同一个组件只是传递的参数不同),但是渲染出来的组件总是第一...可以解决问题,对此查看vue中key的作用: 官网的解释: 是否有key的渲染机制 ...
  • vue key的作用及原理

    2020-08-08 16:52:24
    vue key的作用及原理 v-for 时经常发现不写key值代码会出现警告,其实vue在推荐大家使用key key值作用: 1:当 vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,...
  • react中key的作用

    2020-08-31 16:07:13
    key的作用主要是用来减少没必要的diff算法对比,因为对于一个组件或者节点来说,只要父节点状态或者属性发生变化,该组件就会进行diff对比,即使该组件没变化,而如果为组件引入了key值,就可以在diff对比前先做一个...
  • 列表渲染中的key的作用 给VDOM添加标记 如果没有key会产生的问题: VDOM是惰性的, 它有一个原则, 这个原则叫做’就地复用’ , 它认为我的第一个就是红色的, 删除了第二个之后, 第二个就变成了第一个, 它印象中...
  • Vue中使用key的作用

    2019-07-19 18:32:37
    key的作用是为了在diff算法执行时更快的找到对应的节点,提高diff速度 key具有唯一性 vue中循环需加 :key=“唯一标识” ,唯一标识可以使item里面id index 等,因为vue组件高度复用增加key可以标识组件的唯一...
  • key的作用是为了在diff算法执行时更快的找到对应的节点,提高diff速度 key具有唯一性 vue中循环需加 :key=“唯一标识” ,唯一标识可以使item里面id index 等,因为vue组件高度复用增加key可以标识组件的唯一性,...
  • mybatis中selectKey的作用

    2020-04-29 10:39:55
    selectKey的作用 当添加一个id自增的数据时,可以使用selectKey获取添加的数据的id <insert id="insert" parameterType="com.hp.entity.ItemGroup"> <selectKey resultType="java.lang.Integer" order=...
  • vue 中key的作用

    2019-08-27 11:19:53
    vue 虚拟dom在渲染时为了提高更新...key的作用就是标识每个不同的元素防止元素没有被重新渲染。 示例: <template> <div> <template v-if="binded"> <label>Username</label> ...
  • React中key的作用

    2016-12-03 16:50:00
    对于React中key的作用,官方没有给出详细的解读,只提到在List中需要给key赋值来区分每一条记录,http://blog.csdn.net/code_for_free/article/details/50514259里讲解了key的使用场景, ...
  • 虚拟dom中,key的作用

    2020-08-12 11:08:07
    key的作用 key值的作用,其实是:追踪列表中哪些元素被添加、被修改、被移除的辅助标志。 通俗点来说,就是他可以帮助我们快速对比两个虚拟dom对象,找到虚拟dom对象被修改的元素,然后仅仅替换掉被修改的元素,然后...
  • key的作用 为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性 key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。...
  • 浅谈vue中key的作用

    2019-07-30 09:19:03
    Vue中key的作用: 1、提高vue更新DOM的性能 key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型...
  • key的作用:在diff算法执行时,更快的找到对应的节点,高效的更新虚拟dom, key是具有唯一性的,所以在每次for循环的时候,我们需要key给每个节点做唯一的标识,唯一标识可以使item里面id index 等 然后diff算法就...
  • android打包 keystore中的key的作用是什么?
  • 摘要本文结合源码说明了key的作用,给出了一个不写key的反例,并分析了原因。内容key的作用不写key会出的bug及原因分析key的实践方案key的作用在数据变化前后,vue会得到两个虚拟dom树,并依次比较两个虚拟dom树中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,925
精华内容 3,970
关键字:

key的作用