1.索引可以让查询锁定更少的行,一方面行数减少锁的开销减少,另一方面减少了锁争,提高了并发性。
2.InnoDB只有访问行的时候才会加锁,而索引能减少访问的行数,但前提是InnoDB能过滤掉所有不需要的行才有效。
如果索引无法过滤掉不需要的行,那么InnoDB检索到数据返回给服务器,服务器才能应用where子句,这时已经无法
避免锁定行了。InnoDB已经锁住了这些行,只能等待适当时候释放锁。例如在早期的版本中,只有事务提交才能释放
锁。
explain select id from lottery_user where id < 5 and id <> 1 for update;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | lottery_user | range | PRIMARY | winner_status_index| 1 | NULL | 6 | Using where; Using index |
如果再执行select id from lottery_user where id =1 for update;
当前事务会被挂起,直到第一个事务id=1的行锁被释放。所以即使使用了索引,innoDB也会锁住一些不需要的行,如果不能使用索引查找和行锁定的话,
会更糟糕,Mysql会做全表扫描并锁住所有的行。
但在MySQL 5.1版本后,InnoDB在服务器端过滤掉行后就可以释放锁。
3.另外InnoDB在二级索引上使用的是共享锁,但在访问主键索引时需要排他锁,这就消除了使用覆盖索引的可能性。