insert 数据走索引问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了insert 数据走索引问题相关的知识,希望对你有一定的参考价值。

实际工作中遇到这样一种情况,服务器A上的数据库中有两张表tab_a和tab_b,服务器B上的数据库有一张表tab_c,我已在服务器A上建好dblink并对tab_c建了同义词(名为tab_c),
insert into tab_c select * from tab_a ,tab_b where tab_a.id=tab_b.id and tab_a.task_no='23';
这样插入4000数据却需要18分钟,相应字段都有索引,哪位大神帮忙看看,是什么情况啊?和先查询再远程插入有关吗?tab_a单表大概九千万数据,tab_b表20万数据。谢谢了~

参考技术A select * from tab_a ,tab_b where tab_a.id=tab_b.id and tab_a.task_no='23';
服务器A这个查询要多久呢?
tab_c 是否有其他耗时 类似触发器等
假如有以下一个student表:

sno sname sex sage
200 张三 男 20
300 李四 男 25
400 王五 女 23

primary key(sno),数据库默认会在此字段建立聚集索引,我们讨论的提前是select,update,delete,insert操作涉及到数据库的索引字段。

索引是为加速查询,明显在select时可以提高数据库性能;

由于在insert时,数据库需要维护索引,因此会降低数据库性能;

如果update某条记录时,例如
update student set sex='男' where sno=200
这对数据库性能影响是怎样呢?这时需要维护索引么?如果update大范围或整个表的数据时候呢?

如果delete某条记录,例如
delete * from student where sno=200,因为可以迅速定位这条记录,虽然需要维护索引,但性能一定下降么?
如果delete大范围记录或整个表,这时明显是会降低数据库性能的。本回答被提问者和网友采纳

Mysql查询条件为大于时,不走索引失效问题排查

我们都知道在数据库查询时,索引可以极大的提高查询效率。通常在使用的时候,都会针对频繁查询的关键字段建立索引。

比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在大量数据的情况下提升查询效率。

针对trans_date字段,创建union_idx_query索引,那么在下面以trans_date为查询条件的语句中,毫无疑问是会走索引的:

select count(1) from A; // 40000

EXPLAIN select * from A where trans_date = '20220222'; 

此时,我们会想当然的以为,只要创建了索引,其他情况的使用同样会走索引。比如下面的查询语句:

select count(1) from t_trans_log_info where trans_date > '20220122'; //11200

EXPLAIN select * from t_trans_log_info where trans_date > '20220122';

上面的查询语句使用了”>“来进行范围的查询,而且trans_date字段同样创建了索引,那么上述SQL语句是否会走索引呢?答案是不一定。

explain上述SQL语句,发现没有走索引,而是进行了全表扫描。

但当换一个查询参数时:

select count(1) from t_trans_log_info where trans_date > '20220222'; //1120

EXPLAIN select * from t_trans_log_info where trans_date > '20120222';

explain的结果显示走了索引:

为什么同样的查询语句,只是查询的参数值不同,却会出现一个走索引,一个不走索引的情况呢?

答案很简单:上述索引失效是因为DBMS发现全表扫描比走索引效率更高,因此就放弃了走索引

也就是说,当Mysql发现通过索引扫描的行记录数超过全表的10%-30%时,优化器可能会放弃走索引,自动变成全表扫描。某些场景下即便强制SQL语句走索引,也同样会失效。

类似的问题,在进行范围查询(比如>、< 、>=、<=、in等条件)时往往会出现上述情况,而上面提到的临界值根据场景不同也会有所不同。

所以,如果你在项目中采用了上述方式的查询,又希望它能够走索引,就需要特别注意了。通常需要添加一些其他的限制条件或用其他方式来保证索引的有效性。

博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。

公众号:「程序新视界」,博主的公众号,欢迎关注~

技术交流:请联系博主微信号:zhuan2quan

以上是关于insert 数据走索引问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 大量数据insert操作怎么提高效率

insert与索引的互影响

仗键走天涯003

往数据库里添加数据,update和insert哪个效率高

转://使用insert插入大量数据的总结

sql server insert 与 delete 三百万级数据量时速度极慢,有10分钟左右,求高手如何解决