mysql多条件排序查询
概述数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法。除了对数据进行过滤,我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字段做...
2024.12.03Web应用程序,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 ANDp.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 DESCLIMIT 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 ANDp.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 DESCLIMIT 10持续时间 1 查询: 0.063 秒
health_patient_account(病人账户表)创建索引
INDEX `patient_id` (`patient_id`) USING BTREE
EXPLAIN select *FROM health_patient_account WHERE hospital_id = 4AND 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 子句中的其他条件去过滤这些数据行;
概述数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法。除了对数据进行过滤,我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字段做...
2024.12.03概述在使用order by时,经常出现Using filesort,所以对于此类sql语句我们需要去尽力优化,使其尽量使用Using index。那么,我们对于这类型的语句我们怎么去做优化呢?因为这一...
2024.12.021、现有员工表如下:emp:empno(员工编号),empname(员工名称)sal(员工薪资)1)查询员工的名字和薪资,按照员工的薪资倒序,薪资一样时,按照员工名字正序排。select ename ...
2024.12.02关系型数据库还有一个重要的概念:Join(连接)。使用Join有好处,也会坏处,只有我们明白了其中的原理,才能更多的使用Join。切记不可以:业务之上,再复杂的查询也在一个连表语句中完成。敬而远之,D...
2024.12.02概述今天主要介绍一下MySQL中两表关联的连接表是如何创建索引的相关内容,下面来看看详细的介绍。MySQL两表关联的连接表创建索引创建数据库的索引,可以选择单列索引,也可以选择创建组合索引。假设用户表...
2024.12.04