mysql多表查询如何更快些(数据库MySQL实战)
mysql多表查询如何更快些(数据库MySQL实战)health_patient_medical_history(病例表),21487条health_patient_account(病人账户表),13463条,[存在垃圾数据]SELECT p.* pa.* FROM `health_patient` p INNER JOIN `health_patient_medical_history` pmh ON pmh.patient_id = p.id AND pmh.`status` = 1 INNER JOIN `health_patient_account` pa ON p.`id` = pa.`patient_id` WHERE pmh.`is_show` = 0 AND p.`is_del` = 0 AND pmh.hospital_id = 4 AND p.patient_n
说明Web应用程序,MySQL数据库,数据库中有三张表:health_patient(病人表)、health_patient_account(病人账户表)、health_patient_medical_history(病例表),视图需求是,页面分页展示病人表及账户表的数据,分页需要按照病例表中的创建时间进行排序。
关系说明:
一个health_patient(病人表)对应一个health_patient_account(病人账户表),一个health_patient(病人表)有多条health_patient_medical_history(病例表)。
实现方式
SELECT
p.* pa.*
FROM
`health_patient` p
INNER JOIN
`health_patient_medical_history` pmh
ON
pmh.patient_id = p.id
AND
pmh.`status` = 1
INNER JOIN
`health_patient_account` pa
ON
p.`id` = pa.`patient_id`
WHERE
pmh.`is_show` = 0
AND
p.`is_del` = 0
AND
pmh.hospital_id = 4
AND
p.patient_name LIKE '%%' OR p.id_card LIKE '%%'
AND
p.`id` in(
SELECT
distinct pmh.`patient_id`
FROM
`health_patient_medical_history` pmh
WHERE
pmh.`status` = 1
AND
pmh.`hospital_id` = 4
)
ORDER BY
pmh.create_time DESC
LIMIT 10
问题描述
随着不断得使用,数据越来越多。
数据量:
health_patient(病人表),13458条
health_patient_account(病人账户表),13463条,[存在垃圾数据]
health_patient_medical_history(病例表),21487条
执行上述查询:
持续时间 1 查询: 41.625 秒.
优化方式1、先联合health_patient(病人表)和health_patient_medical_history(病例表)分页查询。
2、然后根据结果集中id,查询health_patient_account(病人账户表),数据进行组装。
SELECT
p.*
FROM
`health_patient` p
INNER JOIN
`health_patient_medical_history` pmh
ON
pmh.patient_id = p.id
AND
pmh.`status` = 1
WHERE
pmh.`is_show` = 0
AND
p.`is_del` = 0
AND
pmh.hospital_id = 4
AND
p.patient_name LIKE '%%' OR p.id_card LIKE '%%'
AND
p.`id` in(
SELECT
distinct pmh.`patient_id`
FROM
`health_patient_medical_history` pmh
WHERE
pmh.`status` = 1
AND
pmh.`hospital_id` = 4
)
ORDER BY
pmh.create_time DESC
LIMIT 10
持续时间 1 查询: 0.063 秒
health_patient_account(病人账户表)创建索引
INDEX `patient_id` (`patient_id`) USING BTREE
EXPLAIN SELECT
*
FROM
health_patient_account
WHERE
hospital_id = 4
AND
patient_id IN (3344 1776 3343 13475 10954 13308 13474 13264 13473 1343)
Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown);
Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;