主键索引与唯一索引的区别、索引失效的几种情况

一、主键索引和唯一索引的区别

(1)主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

(2)主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

(3)唯一性索引列允许空值,而主键列不允许为空值。

(4)主键可以被其他表引用为外键,而唯一索引不能。

(5)一个表最多只能创建一个主键,但可以创建多个唯一索引。

(6)主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

(7)在RBO模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

约束主要有:主键约束、外键约束、非空约束、检查约束(bentwen and ,大于、小于、等于、不等于)、唯一约束。

二、索引失效的几种情况

1、索引并不总是都会生效的,比如以下几种情况,将导致索引失效,从而走全表扫描:

(1)如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因),如果要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

(2)对于复合索引,如果不使用前列,后续列也将无法使用索引,复合索引需要满足最左匹配原则;

(3)模糊查询like以%开头;

(4)索引列的数据存在数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引;

(5)where子句里对索引列上有数学运算,用不上索引;

(6)where 子句里对有索引列使用函数,用不上索引;

(7)如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

2、什么情况下不推荐使用索引

(1)数据唯一性差(一个字段的取值只有几种时,例如性别字段)的字段不要使用索引;

(2)频繁更新的字段不要使用索引;

(3)字段不在where语句出现时不要添加索引,如果where后含IS NULL 、IS NOT NULL、 like ‘%输入符%’等条件,不建议使用索引;

(4)where 子句里对索引列使用不等于(<>),使用索引效果一般。


参考博文:
(1)https://www.cnblogs.com/-619569179/p/6528896.html
(2)https://www.cnblogs.com/liehen2046/p/11052666.html
(3)https://blog.csdn.net/guoxingege/article/details/51034387

posted @ 2021-06-08 17:41  jason小蜗牛  阅读(3443)  评论(0编辑  收藏  举报