为什么我只查一行的语句,也执行这么慢

一: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';
这条语句执行慢?

猜你喜欢

转载自www.cnblogs.com/hanguocai/p/10187067.html