在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别?

上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。

1、主键索引

主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。

在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则:

1、采用一个没有业务用途的自增属性列作为主键;

2、主键字段值总是不更新,只有新增或者删除两种操作;

3、不选择会动态更新的类型,比如当前时间戳等。

这么做的好处有几点:

1、新增数据时,由于主键值是顺序增长的,innodb page发生分裂的概率降低了;可以参考以往的分享“[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键”;

2、业务数据有变更时,不修改主键值,物理存储位置发生变化的概率降低了,innodb page中产生碎片的概率也降低了。

MyISAM表因为是堆组织表,主键类型设计方面就可以不用这么讲究了。

2、辅助索引

辅助索引,就是我们常规所指的索引,原文是SECONDARY KEY。辅助索引里还可以再分为唯一索引,非唯一索引。

唯一索引其实应该叫做唯一性约束,它的作用是避免一列或多列值存在重复,是一种约束性索引。

3、主键索引和辅助索引的区别

在MyISAM引擎中,唯一索引除了key值允许存在NULL外,其余的和主键索引没有本质性区别。也就是说,在MyISAM引擎中,不允许存在NULL值的唯一索引,本质上和主键索引是一回事。

而在InnoDB引擎中,主键索引和辅助索引的区别就很大了。主键索引会被选中作为聚集索引,而唯一索引和普通辅助索引间除了唯一性约束外,在存储上没本质区别。

从查询性能上来说,在MyISAM表中主键索引和不允许有NULL的唯一索引的查询性能是相当的,在InnoDB表通过唯一索引查询则需要多一次从辅助索引到主键索引的转换过程。InnoDB表基于普通索引的查找代价更高,因为每次检索到结果后,还需要至少再多检索一次才能确认是否还有更多符合条件的结果,主键索引和唯一索引就不需要这么做了。

经过测试,对100万行数据的MyISAM做随机检索(整数类型),主键和唯一索引的效率基本一样,普通索引的检索效率则慢了30%以上。换成InnoDB表的话,唯一索引比主键索引效率约慢9%,普通索引比主键索引约慢了50%以上。

关于MySQL的方方面面大家想了解什么,可以直接留言回复,我会从中选择一些热门话题进行分享。 同时希望大家多多转发,多一些阅读量是老叶继续努力分享的绝佳助力,谢谢大家 :)

mysql主键索引_MySQL索引之主键索引相关推荐

  1. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  2. mysql 如何添加索引_MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】...

    MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...

  3. mysql 建表时建立索引_mysql 分享建表和索引的几点规范

    一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...

  4. mysql 回表查询优化_mysql:若何行使笼罩索引制止回表优化查询

    说到笼罩索引之前,先要领会它的数据结构:B+树. 先建个表演示(为了简朴,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml 17 ...

  5. mysql中视图备份_MySQL 事务、视图、索引、备份和恢复

    事务 为什么需要事务: 转账.总量不变,但其他值进行变化. 事务是什么: 作为单个逻辑工作单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行/不执行. 事务是一个不可分割的工作逻辑单元. ...

  6. mysql聚集索引_MySQL中怎样创建聚集索引和非聚集索引,求创建这两种索引的SQL语句。谢谢...

    ALTER TABLE t1 ADD INDEX(or CREATE INDEX) ALTER TABLE t1 ADD FULLTEXT INDEX ALTER TABLE t1 ADD COLUM ...

  7. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  8. mysql左模糊 走索引_mysql的模糊查找是否走索引问题

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库中索引对于查找是非常有用的,楼主做了两个实验,插入数据的时候非常慢,楼主是这样实验的: 一:数据库列的索引 ①:首先执 ...

  9. mySQL数据表创建索引_MySQL创建数据表 建索引

    除非注明,文章均为易水寒原创,版权属于易水寒博客,转载请注明出处,谢谢. 三.数据字段属性: 1.unsigned 可以让空间增加一倍,如果不希望在字段中插入负值就使用此属性,另外只能用在数值型字段. ...

  10. mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例

    上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...

最新文章

  1. JScrollPane 双滚动条
  2. [转]Docker基础-使用Dockerfile创建镜像
  3. mysql 连接openfire_修改openfire数据库连接(转)
  4. 悟空php微信复制的东西在哪找,微信收藏的文件在哪?从哪里能看到?
  5. oracle awr报告生成_分享AWR报告的生成和简单分析方法
  6. window命令行大全
  7. 循环神经网络_小孩都看得懂的循环神经网络
  8. Nginx域名重定向
  9. 在CentOS上部署开源博客系统Blog_mini
  10. 一般纳米材料是指尺度为_水溶性单分散纳米材料的开发意义
  11. 概率论 方差公式_概率论基本问题
  12. SpringMVC工作原理详细讲解
  13. java applet介绍,Java中的Applet介绍
  14. 进程管理系统的设计与实现 SDUT 操作系统实训 项目 Java
  15. 【原创】VBA学习笔记(300)VBA 很多工作表函数都只对1维数组有用,用2维数组上经常报错!
  16. 【C语言】实现简单的计算器
  17. JavaScript和JQuery好书推荐
  18. 当初的愿望实现了么?
  19. 我的第六个项目:实现一个任意图片下载器
  20. html中富田文本,富田桥曾氏游浆豆腐制作技艺

热门文章

  1. 【算法与数据结构】查找二叉树的实现
  2. lucene源码分析(7)Analyzer分析
  3. 微服务实践分享(2)api网关
  4. 深入redis内部之redis启动过程之二
  5. Android Studio 分析器详解
  6. Lesson 6.动态计算图与梯度下降入门
  7. 李宏毅深度学习——第一天(Bias and Variance)
  8. 基于迁移学习的反欺诈方法研究
  9. 引擎讲解2--主要是MyISAM和InnoDB的区别
  10. mysql的引擎讲解