暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql--------普通索引和唯一索引怎么选择?

Lord Lean Notes 2020-02-13
329

我们现在有一个业务系统,存储的是市民的身份信息,每个市民都有一个唯一的身份证号,并且我们在业务代码中已经保证了不会插入重复的身份证号。现在我们有一条语句经常被执行:"select * from t where id_card='xxxxxx...'"。这种情况怎么给表建立合适的索引呢?

选择索引

针对上面的情况,可以给id_card字段添加普通索引和唯一索引两种,不要把它作为主键,因为id_card字段较大。下面来分析下选择他们的原因。
查询过程

sql语句的普通索引查询是通过存储引擎读取数据的,而InnoDB读取数据是按数据页,将符合的数据以页为单位读取到内存中。普通索引的查询是多了一次指针查询和计算,这个指的是当读到符合条件的数据之后,还需要读一个不符合条件的数据。

而唯一索引的查询是通过索引读取到符合的数据,就会停止查询,然后把数据按照页单位返回到内存中。

更新过程

在分析更新过程时,要先学习一个change buffer。当更新数据时,如果数据在内存中则直接更新数据,如果不在内存中,InnoDB引擎会在不影响数据一致性的情况下把记录存入change buffer中,当读取到该条数据时,读取到内存中后,会执行change buffer的相关操作,通过这种方式保证数据逻辑的正确性。change buffer使用的是buffer pool的空间,我们可以通过innodb_change_buffer_max_size来设置最大可占用的空间。
那什么时候使用change buffer呢?对于唯一索引,在更新数据时,需要将所有的数据读入内存,然后判断是否违反唯一约束,不违反则直接更新内存,不需要使用到chang buffer。对于普通索引来说,使用change buffer可以减少写磁盘的次数。
—————————————————————————————————————————
在这篇文章中对"mysql--------数据库的优化方式"这篇文章增加一个优化方式——索引下推。

当我们使用联合索引查询时,我们的查询条件也是联合索引的字段,mysql会使用索引下推的方式对sql语句进行优化,来减少回表的次数。

文章转载自Lord Lean Notes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论