发布网友
共4个回答
懂视网
本文分析了MySQL中字符串索引对update的影响。分享给大家供大家参考,具体如下:
对某一个类型为varchar的字段添加前缀索引后,基于该子段的条件查询时间基本大幅下降;但对于update操作,所耗的时间却急剧上升,主要原因是在更新数据的同时,mysql会执行索引的更新。
下面做了一个简单的试验。
(1)首先对某个亿级记录的表字段所有记录执行更新:
for idx in range(1, count+1): sql = "update tbl_name set platforms=+datetime.now().strftime('%Y%m%d%H%M%S%f')+ where id="+str(idx)+";" cursor.execute(sql)
统计用时4个小时左右。
(2)然后对某个亿级记录的表子段添加索引:
sql = "alter table tbl_name add index platforms_index(platforms(8));" cursor.execute(sql)
然后再执行同上的update语句,统计用时将近9个小时。
(3)由此可见字符串索引对于update等操作在性能上有极大的影响。
虽然以上小试验并没有多大实际意义,但是可以延伸一下,如果不对该字段添加索引,而是直接把该字段数据存储到另一个小表b,然后在该表添加一个id字段映射到小表b,然后再执行update操作;这样性能又如何呢?
理论上性能应该与记录的重复度有关,如果重复率高,小表b将会很小(unique去重);而更新所用时间为通过原表映射查询表b字段的时间+更新表b记录的时间,总体上应该比更新记录的时间+更新索引的时间要少。
不过只是估算,结果如何感兴趣的朋友可以动手验证一下。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
热心网友
看A表中的数据量了,数据量大的话,C列建索引肯定是加快速度的,因为建了索引后可以通过索引快速找到C=2的数据,然后进行更新。
如果数据量不大的话,那就没多大影响的,也不会减少多少速度的
如果你要一次性更新大量数据的话,索引就可能会拖慢速度了,因为要先写数据,然后再维护索引,多一步操作总归是要花时间的
热心网友
假如你的表
A ( ID 主键, B, C );
UPDATE A SET B=1 WHERE C=2;
如果 A 表数据有 1000 W行, C 的分布为 1,2,3 .... 1000W
如果 C 上面没有索引, 那么上面的操作, 走 “全表扫描”
那么要访问全部的 1000 W行 数据之后, 才知道, 本 SQL 语句, 需要 更新 1行数据。
然后完成 update 操作。
基本的操作成本是, 顺序访问表, 1000W 行。
如果 C 上面有索引, 那么上面的操作, 走 索引。
首先, 通过索引, 定位到, 满足 c= 2 的数据, 有1行, 物理地址是 ( 0x,,,,)
然后 通过 物理地址, 去 访问表的数据, 更新相应的数据行的处理。
这种情况下, C上面有索引, 处理速度比没索引要快。
基本的操作成本是
访问索引, 获取索引信息 1行。
根据物理地址访问表, 1 行。
如果 A 表数据有 1000 W行, C 的分布为 1,2 ( 其中 c=1 的有 500W, c=2 的有 500W)
这种情况下。 如果 C 上面有索引, 并且数据库还使用索引的话, 那么可能速度就没索引还慢了。
因为, 通过索引, 定位到, 满足 c= 2 的数据, 有500W行, 物理地址是 ( 500W 个物理地址), 然后去完成 update 操作。
基本的操作成本是
访问索引, 获取索引信息 5000行。
根据物理地址访问表, 5000 行。
热心网友
有了索引在插入更新都会慢