普通索引和唯一索引对比

本文探讨了数据库中普通索引与唯一索引在查询和更新过程中的性能差异。在查询方面,两者性能相近,唯一索引稍优;在更新过程中,唯一索引因无法使用change buffer导致插入性能较低。选择索引类型应根据读写比例,读多写少场景推荐唯一索引,反之则推荐普通索引。此外,业务需求如数据唯一性也是选择关键。实际应用中,更改索引类型可能影响性能,归档库可考虑使用普通索引提高速度。

1.性能对比

(1)查询过程

假设执行查询的语句是:select * from T where k=5,首先在B+树上搜索到在哪个页,然后在页内部通过二分法进行查找;

普通索引:查找到第一个k=5的记录之后,会继续往下查找,直到找到一个不满足k=5的记录就停止;

唯一索引:索引定义了唯一性,所以找到第一个记录之后就不会往下查找了。

那这个不同对性能影响大吗?

众所周知,InnoDB的数据是按照数据页为单位进行读写的,在查询一条记录的时候,是把整个页加载到内存里面的,一页的大小是16KB,如果k=5的记录都在同一页上面,那性能差距微乎其微,如果k=5的记录是跨页的,性能差距会相对大一些,取决于跨了多少页,考虑到1页的大小是16kb,那如果存储8个字节的整型数据的话可以存储2000个左右,我们正常查询数据也不会查询这么多,所以跨页的情况总体来说也不多。

总结:通过以上分析,普通索引和唯一索引在查找性能上相差不大,唯一索引会稍微好一些。

(2)更新过程

首先需要理解什么是change buffer?

更新数据时如果数据页就在内存中则可以直接更新,如果不在内存中,正常流程则需要把数据页先读取到内存中,然后再进行更新,这里的读取会涉及磁盘的随机io,比较消耗性能,所以就引入了change buffer在内存中先把更新操作保存起来,而不进行读取操作,写入数据时减少了随机io,提升了写入性能。

那change buffer什么时候执行呢?

第一种情况就是系统定期执行,第二种情况就是如果这个时候有查询操作过来了,那必须得读取数据然后进行更新了。

所以如果对于刚刚更新就需要读取的情况,chang buffer会影响查询速度。

对于唯一索引,由于需要判断插入的数据是否在数据库中是否已经有了,那每次插入都必须先读取页数据到内存中,然后进行判断,然后在内存中做变更,所以唯一索引不能使用change buffer。

总结:插入性能唯一索引比普通索引要差一些。

2.如何选择

(1)从查询性能角度考虑,唯一索引的查询性能略胜普通索引,但是插入性能唯一索引比普通索引差得较多,所以如果是读多写少的场景唯一索引略胜一筹,如果是读少写多的场景普通索引略胜一筹;

(2)从业务角度考虑,如果某个字段需要保证唯一性,那最好还是使用唯一索引来保证,防止产生脏数据对业务功能造成影响,当然mysql的唯一索引只是保证唯一性的一种方式,也可以使用其它的方式保证数据唯一性。

3.其它思考

(1)之前在线上碰到过:前一天把普通索引改成了唯一索引,第二天发现这张表的性能急剧下降,后面分析应该就是唯一索引插入的性能比普通索引性能差一些,所以导致的这个问题;

(2)对于一些“归档库”其实是可以把普通索引改成唯一索引的,因为主库已经保证了唯一性了,唯一索引改成普通索引,可以让归档速度更快。

03-08
### MathPix工具介绍 Mathpix Snipping Tool 是一款强大的数学公式识别工具,从最初的原型发展至今已经历了多次迭代和功能增强[^1]。该工具不仅能处理简单的数学表达式,还可以应对复杂的数学模型以及多行公式,并且支持手写公式的识别。 这款应用程序通过不断的科技创新与用户反馈改进,在学术研究和技术领域赢得了良好声誉,成为许多科研人员不可或缺的工作伙伴之一。除了基本的功能外,Mathpix 还提供了多种高级特性来满足不同用户的特定需求。 ### 使用方法 #### 安装与启动 为了使用 Mathpix Snipping Tool ,首先需要下载安装程序并按照提示完成设置过程。一旦成功安装后即可随时调用此应用来进行截图操作。 #### 截取屏幕上的公式图像 当遇到想要转换成 LaTeX 或 AsciiMath 的图片时,只需打开软件界面按下快捷键(默认为 `Ctrl+Alt+M`),此时鼠标指针会变为十字形状以便于选取目标区域;框选所需部分之后松开按键即刻上传至云端服务器等待进一步分析处理。 #### 获取LaTeX代码片段 经过短暂几秒钟的时间延迟过后,所截获的内容将以纯文本形式显示出来供复制粘贴到其他编辑器当中继续编写文档或是分享给他人查看交流之用。 ```python import pyperclip # 假设已获取到LaTeX字符串 stored_in_variable named latex_code pyperclip.copy(latex_code) print("LaTeX code has been copied to clipboard.") ``` 对于希望深入探索更多可能性的用户来说,可以考虑查阅官方提供的扩展插件——如用于解析Markdown文件内的公式标记语法的库 **mathpix-markdown-it** [^2] ——这将进一步提升工作效率和个人体验感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值