此查询锁定(导致其锁定元数据)数据库,用户无法执行任何其他操作
这个查询到底出了什么问题,并建议对查询进行更改以使其正常工作。
SELECT
a.uid, p.fname, p.lname
FROM
adt_data a
INNER JOIN
p_data p ON a.uid = p.uid
WHERE
a.id
IN (
SELECT MAX( id )
FROM
adt_data
GROUP BY
uid, facility_id
ORDER BY
id DESC
)
AND
patient_category !=3
AND
a.uid NOT
IN
( 6987 )
ORDER BY
p.lname, p.fname
解释从adt_data GROUP BY pid、facility_id ORDER BY id DESC中选择MAX(id)正在返回
id select_type表类型possible_keys key _len ref rows额外
1 SIMPLE adt_data ALL NULL NULL NULL NULL 13757使用临时;使用文件端口
第13757行
解释下整个查询的结果
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ALL pid,patient_category NULL NULL NULL 13757 Using where; Using temporary; Using filesort
1 PRIMARY p eq_ref pid pid 8 bestcaredb_19jun15.a.pid 1
2 DEPENDENT SUBQUERY adt_data ALL NULL NULL NULL NULL 13757 Using temporary; Using filesort
要在mysql中调试表锁,应该使用describe或explain。首先检查子查询的结果
explain select MAX(id) from adt_data ...
这将显示访问了多少行,以及键是否被索引,这将加快匹配和排序操作。
添加密钥
要添加密钥,例如adt_data,您可以使用
alter table adt_data add key facuser (uid,facility_id), add unique key id;
其中,对(uid,facility_id)是一个非唯一键,并且id必须是唯一的。