看一些基本信息。
Table: sdb_base_kvstore
Create Table: CREATE TABLE `sdb_base_kvstore` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`prefix` varchar(255) NOT NULL,
`key` varchar(255) NOT NULL,
`value` longtext,
`dateline` int(10) unsigned default NULL,
`ttl` int(10) unsigned default '0',
PRIMARY KEY (`id`),
KEY `ind_prefix` (`prefix`),
KEY `ind_key` (`key`)
) ENGINE=MyISAM AUTO_INCREMENT=9417702 DEFAULT CHARSET=utf
8
id: 1
prefix: system
key: service_last_modified.base_application_dbtable.b
ase
value: s:32:"f765565d5b6a3bf8d1ccb18bd6058ab9";
dateline: 1328604155
ttl: 0
SELECT `prefix`, `key` FROM sdb_base_kvstore WHER
E ttl>0 AND (dateline+ttl)<1361339749 LIMIT 617900, 100
类似的,有很多条thread ,
问题主要是对sdb_base_kvstore 的查询很多,很多个thread,造成read lock。
分析,这个没有走索引,所以会比较慢一点,而且有很多并发,myisam的表级锁争用造成性能问题,但是会造成read lock ,这个不懂为什么,照理说select表锁不会阻塞其他的读操作。
解决方案是在ttl上建立索引,并且把表转成innodb的。主要是后者,innodb的行锁,大大提升并发性能。
问题可解决。