zoukankan      html  css  js  c++  java
  • MySQL

    在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。

    为什么InnoDB表必须有主键?

    Mysql索引设计如此....mysql设计的就是innoDB把你的数据主键索引用B+Tree来组织的,没有主键他的数据就没有一个结构来存储。即:主键索引就是数据文件本身!

    为什么推荐主键是整形呢?

    MySQL查找过程,就是把节点load到内存然后在内存里不断的去进行数据的比对。假设UUID,既不自增也不是整形。问一下,是整形的1<2比较的效率高还是字符串的“abc”和“abe”比较的效率高呢?显然是前者,因为字符串的比较是转换成ASICI一位一位的比,如果最后一位不一样,比到最后才比较出大小,就比整形比较慢多了,存储空间来说,整形更小。索引越节约资源越好。

    为什么推荐主键是自增的呢?

    1.更方便遍历

    如果主键是自增的,那么当遍历数据,从当前节点开始,就可以根据节点间的指针快速找到下一个节点去遍历。

    2.更快速的做数据插入操作,避免增加维护索引的开销

    如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。

    如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置。此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

    参考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

  • 相关阅读:
    yum 本地 网络 openstack
    docker 负载均衡
    tomcat + nginx 负载均衡 动静分离 session会话配置
    K8S Ingress 之 traefik-ingress-controller
    CentOS7安装和配置rsync+inotify
    DAS,NAS,SAN在数据库存储上的应用
    inotify+rsync实现实时同步
    NFS网络文件系统
    CentOS7下rsync服务的基本详解和使用
    LVM--逻辑卷管理
  • 原文地址:https://www.cnblogs.com/frankcui/p/15312181.html
Copyright © 2011-2022 走看看