一:mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=100000)do
insert into t values(i,i)
set i=i+1;
end while;
end;;
delimiter ;
call idata();
第一类:
mysql> select * from t where id=1;
show processlist 分析一下:
(1)等mdl 锁
这个状态表示有一个线程正在表t上请求或者持有mdl写锁,把select 堵住了。
这类问题的处理方法:找到谁持有mdl写锁,然后把它kill掉。
在performance_schema 和sys 系统中查。
通过查询sys.schema_table_lock_waits 就可以直接找到阻塞的process id .把这个连接用kill命令断开。
等flush
mysql> select * from information_schema.processlist where id=1;
表示的是现在有一个线程正要对表t做flush操作。
flush tables t with read lock;
flush tables with read lock;
关闭表t ,关闭mysql里所有打开的表。
原因:
等行锁:
mysql> select * from t where id=1 lock in share mode;
怎么查出谁占得这个写锁。
mysql> select * from t sys.innodb_lock_waits where locked_table=`'test'.'t'`\G
kill 4.
第二类:查询慢
mysql> select * from t where c=50000 limit 1;
这里如何没有索引就会查询50000条,所以慢。
mysql> select * from t where id=1;
练习:
mysql> CREATE TABLE `table_a` (
`id` int(11) NOT NULL,
`b` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `b` (`b`)
) ENGINE=InnoDB;
mysql> select * from table_a where b='1234567890abcd';
这条语句执行慢?