今天我又对如果利用索引避免锁表方面进行了测试对于索引的间隙锁,本以为锁定的是索引键值的范围,即满足最小键值至最大键值的记录被锁定比如我对表中的user_id加索引,修改user_id >=1 and user_id <=3的记录; 或者user_id IN (1,3)
本以为是对user_id为2的记录会上锁,对user_id为4的记录便不会上锁。但实际发现貌似这样的语句不能利用索引,引起了全表锁定,不知道我的理解是否正确?

解决方案 »

  1.   

    userid上有索引吗用的什么引擎
      

  2.   


    你mysql的存储引擎是myisam还是innodb呢?
      

  3.   

    你的show index 和查询语句是什么? 理论上INNODB应该是只锁记录。
      

  4.   

    嗯 用的是innodb,user_id不是主键,建的索引
      

  5.   

    show create table tbname看看
      

  6.   

    show  create table 看看
      

  7.   

    你的数据量多大?过小,MYSQL会全表扫描
    show create table 
      

  8.   

    数据量多大?太少,MYSQL会全表扫描
    show create table
      

  9.   

    谢谢各位的关注确实数据量是一个比较重要的因素,我加了50W记录后测试就基本符合了现在的结论是用in的话是行锁,只锁住对应行的记录用范围查询的话,是锁定的索引键值范围,如user_id >=105 and user_id <=110,锁住了105-111的6条记录,最后都多锁了一条记录,呵呵。各位还有什么要补充的吗?
      

  10.   


    IN语法,实际上内部操作是一个个的等于,
    select * from a where id in(1,2,3,4)
    ==>
    select * from a where id=1
    union all
    select * from a where id=2
    union all 
    .......................这样的ID键查询,使用的是行锁。
      

  11.   

    show create table 看看
      

  12.   

    推荐大家阅读文章:MySQL InnoDB之事务与锁详解
      

  13.   

    MyISAM是表级锁定,INNODB只是row level锁定。如题看不出来。静观大侠们的杰作。
      

  14.   

    innodb添加新字段,并建立普通索引,一定会锁表吗