当前位置: 代码迷 >> J2EE >> 对于一个频繁增删的表,怎么建立索引,提高查询效率
  详细解决方案

对于一个频繁增删的表,怎么建立索引,提高查询效率

热度:39   发布时间:2016-04-17 23:37:52.0
对于一个频繁增删的表,如何建立索引,提高查询效率?
我有一个表A,可以看做是临时表,我启动了一个线程,不停的查询这个表,只要有数据,便取出处理并删除。在索引的建立规则中,对于一个频繁删除和增加的表适不适合建立索引的。所以表A我并没有建立索引。
这里要提一个问题:就是之前我的表A是有索引的,可是线程在执行20分钟左右后,就会自己停止,线程未退出,
就像阻塞了一样。
一直不清楚是什么问题,后来考虑到可能是索引的问题,就把索引删了。测试时项目启动了6 7 个小时,一直没问题。

但是,如果A表中有了太多的数据,项目就会报错,query execution was interrupted
我从网上查到是慢查询导致的异常。
我的查询其实很简单,就是一个select from limit 200;可是我A表有4000w条数据,用这个查询就会非常慢。
我只是每次想取到A表的前200条数据,处理并删除。可是数据量一大,就出现了问题。

请问现在的问题怎么解决?
------解决思路----------------------
首先,我觉得必做的是添加个锁表检测线程,自动排除死锁...
因为其他方法常常要调整工作量大的,而且智者千虑 必有一失,谁也不能保证哪块代码绝对的不锁表。。
锁表检测::一般数据库都提供一个特别sql查询锁住的表,查出来后调用数据库sql提供的 kill ( 这个kill是数据库提供的kill语句,非操作系统的kill程序)  , 杀掉锁住的sql连接id  

2.检测长查询,长时间更新等操作语句,,一般锁表都是这类语句造成的,锁表查询一般可查看到那条sql的执行时间。。
数据库服务器配置日志也可以记录长时间的sql语句
代码层也可使用日志记录执行时间。。

一般是相关索引没有加或者长事务造成,缺失索引要加上。。
 

3.使用短事务。。单语句事务( 无事务)
长事务会大大增加锁表机会。。
 
尽可能不使用事务操作,事务虽然减少io以及增加数据完整性,但目前当务之急是死锁,适当放弃事务是个完美平衡。。


4.逻辑删除并读写分离分表。。
这个删除标志 可以放在a_del表里,通过外键与A表关联。。。这样A表就没有更新了,只有查询了。。A_del表则基本只增加操作了。。读写分离大大减少锁表可能性。。
这个删除标志要加索引。。


 .添加个线程定时做物理删除....
 
 
 3,我每次取出队列表的数据,会做相应的处理,同时会更新另外几个表的信息。你说,频繁删除更新 也许造成了锁表...造成阻塞.....。如果更新也会锁表,那么这几个表是不是都要处理? 
 这个看情况,只要锁表检测做好了,一般就大大轻松了。。不用那么严格的避免锁表了,
  相关解决方案