子查询指的是一个查询是另外一个查询的条件,之间关系是用in来构建
虽然有时候用explain显示是用到索引 但是看到rows的时候就发现还是扫描了最外边表中的大多数数数据 (这种情况出现在了mysql5.5和5.6版本里边。5.7得到了优化)
看两个例子
UPDATE
task_manager
INNER JOIN
(SELECT
task_id
FROM
task_details_manager
WHERE TASK_STATE = '5'
AND client_id = clientId) detail
ON task_manager.id = detail.task_id SET TASK_STATE = '90',
UPDATE_DATE = DATE_ADD(
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'),
INTERVAL FLOOR(RAND() * 5) MINUTE
),
TASK_STATE_RECORD = (
CASE
RIGHT(TASK_STATE_RECORD, 2)
WHEN '90'
THEN TASK_STATE_RECORD
ELSE CONCAT(TASK_STATE_RECORD, ",90")
END
) ;
和
--------------------------------------------------------------------------------------------------------------------
UPDATE
task_manager
SET
TASK_STATE = '90',
UPDATE_DATE = DATE_ADD(
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'),
INTERVAL FLOOR(RAND() * 5) MINUTE
),
TASK_STATE_RECORD = (
CASE
RIGHT(TASK_STATE_RECORD, 2)
WHEN '90'
THEN TASK_STATE_RECORD
ELSE CONCAT(TASK_STATE_RECORD, ",90")
END
)
WHERE id IN
(SELECT
task_id
FROM
task_details_manager
WHERE TASK_STATE = '5'
AND client_id = clientId) ;
这两个sql在高低版本的mysql查询速度截然不同 第一个扫描了1行 但是第二个却扫描了1260000行。
另外发现update 居然也可以用inner 不得不惊叹mysql实在太灵活了