MySQL索引之主键索引

作者:mysql中文网 时间:2024-01-25 01:52:04 

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

标签:主键索引
0
投稿

猜你喜欢

  • python 装饰器的基本使用

    2021-04-01 07:12:50
  • 备战618!用Python脚本帮你实现淘宝秒杀

    2022-05-15 04:43:40
  • Python发送邮件功能示例【使用QQ邮箱】

    2021-08-29 10:27:41
  • 五个方便好用的Python自动化办公脚本的实现

    2022-04-13 10:10:59
  • Python fileinput模块使用实例

    2022-02-28 12:02:19
  • Python Tkinter 简单登录界面的实现

    2021-01-10 20:45:03
  • MySQL中对于NULL值的理解和使用教程

    2024-01-27 22:51:02
  • Python根据欧拉角求旋转矩阵的实例

    2022-09-03 15:11:00
  • PyQt5实现简单数据标注工具

    2021-10-24 04:55:54
  • python shapely.geometry.polygon任意两个四边形的IOU计算实例

    2021-09-23 03:19:46
  • python实现自动登录人人网并访问最近来访者实例

    2022-11-30 17:09:15
  • 使用Python绘制三种概率曲线详解

    2022-07-27 00:21:01
  • mysql 截取指定的两个字符串之间的内容

    2024-01-17 21:19:54
  • python实现将一维列表转换为多维列表(numpy+reshape)

    2021-04-22 03:06:30
  • 如何获取numpy array前N个最大值

    2022-02-08 18:48:28
  • MySQL学习第四天 Windows 64位系统下使用MySQL

    2024-01-24 02:35:46
  • Python实现石头剪刀布游戏

    2022-09-03 10:37:30
  • PHP如何实现HTTP验证

    2023-09-04 05:32:46
  • javascript开发经验谈

    2009-05-01 12:14:00
  • Python内建类型float源码学习

    2022-05-05 17:07:37
  • asp之家 网络编程 m.aspxhome.com