说明Web应用程序,MySQL数据库,数据库中有三张表:health_patient(病人表)、health_patient_account(病人账户表)、
health_patient_medical_history(病例表),视图需求是,页面分页展示病人表及账户表的数据,分页需要按照病例表中的创建时间进行排序 。
关系说明:
一个health_patient(病人表)对应一个health_patient_account(病人账户表),一个health_patient(病人表)有多条
health_patient_medical_history(病例表) 。
实现方式
SELECTp.*,pa.*FROM`health_patient` p INNER JOIN`health_patient_medical_history` pmh ONpmh.patient_id = p.id ANDpmh.`status` = 1 INNER JOIN`health_patient_account` pa ONp.`id` = pa.`patient_id` WHEREpmh.`is_show` = 0 ANDp.`is_del` = 0 ANDpmh.hospital_id = 4 AND p.patient_name LIKE '%%' OR p.id_card LIKE '%%'ANDp.`id` in(SELECTdistinct pmh.`patient_id`FROM`health_patient_medical_history` pmhWHEREpmh.`status` = 1ANDpmh.`hospital_id` = 4) ORDER BYpmh.create_time DESCLIMIT 10
问题描述随着不断得使用,数据越来越多 。
数据量:
health_patient(病人表),13458条
【数据库,MySQL,实战,优化,多表联合查询排序问题优化】health_patient_account(病人账户表),13463条,[存在垃圾数据]
health_patient_medical_history(病例表),21487条
执行上述查询:
持续时间 1 查询: 41.625 秒.
优化方式1、先联合health_patient(病人表)和
health_patient_medical_history(病例表)分页查询 。
2、然后根据结果集中id,查询health_patient_account(病人账户表),数据进行组装 。
SELECTp.*FROM`health_patient` p INNER JOIN`health_patient_medical_history` pmh ONpmh.patient_id = p.id ANDpmh.`status` = 1 WHEREpmh.`is_show` = 0 ANDp.`is_del` = 0 ANDpmh.hospital_id = 4 AND p.patient_name LIKE '%%' OR p.id_card LIKE '%%'ANDp.`id` in(SELECTdistinct pmh.`patient_id`FROM`health_patient_medical_history` pmhWHEREpmh.`status` = 1ANDpmh.`hospital_id` = 4) ORDER BYpmh.create_time DESCLIMIT 10
持续时间 1 查询: 0.063 秒
health_patient_account(病人账户表)创建索引
INDEX `patient_id` (`patient_id`) USING BTREE
EXPLAIN SELECT*FROMhealth_patient_account WHEREhospital_id = 4ANDpatient_id IN (3344, 1776, 3343, 13475, 10954, 13308, 13474, 13264, 13473, 1343)
文章插图
Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown);
Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;
推荐阅读
- MySQL高级SQL语句
- SpringBoot通过JdbcTemplate操作MySQL数据库
- MySQL 团队开发规范,太详细了,建议收藏
- Python生成遍历暴力破解密码,实战的效果差强人意了
- 数据库:评估安全风险4个要点
- MySQL中如何生成连续的自然日
- MySQL 主键约束、非空约束、唯一约束
- mysqlcheck 修复数据库表
- MySQL小技巧:INT类型到达阈值,动态修改表schema失败怎么办
- MySQL for macOS如何调出命令行客户端MySQL Command Line Client