<返回更多

数据库,MySQL,实战,优化,多表联合查询排序问题优化

2021-11-05    IT小奋斗
加入收藏

说明

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) 
数据库,MySQL,实战,优化,多表联合查询排序问题优化

 

Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown);

Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>