具有多个左连接的 mysql 查询需要大量时间来获取数据

标签 mysql datatable

我正在使用 mysql select 查询从多个表中获取行以生成报告。

随着行数的增加,需要花费大量时间来获取。

我发现使用左连接会使查询变慢。

可以使用什么替代方法来使查询执行得更快。

下面是我正在使用的查询。查询结果是一份报告,根据患者年龄和疾病类型给出患者计数。

例如:疾病是病毒性发烧比当月年龄在 0 到 15 岁男性、0 到 15 岁女性、16 到 45 岁男性、16 到 45 岁女性之间的患者数是多少。

查询:

    SELECT 
        ds.disease_type as disease, 
        SUM(CASE WHEN (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' THEN 1 ELSE 0 END) as patient_count, 
        SUM(CASE WHEN ((DATE_FORMAT(pdm.visited_date, '%Y-%m-%d')) BETWEEN '2019-04-01' AND '2020-03-01') THEN 1 else 0 end) as disease_morbidity_cumulative_no,
        SUM(case when ic.age BETWEEN 0 AND 15 AND ic.gender ='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count1_male, 
        SUM(case when ic.age BETWEEN 0 AND 15 AND ic.gender ='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count1_female, 
        SUM(case when ic.age BETWEEN 16 AND 45 AND ic.gender ='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count2_male, 
        SUM(case when ic.age BETWEEN 16 AND 45 AND ic.gender ='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count2_female, 
        SUM(case when ic.age >45 AND ic.gender='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count3_male, 
        SUM(case when ic.age >45 AND ic.gender='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count3_female 
    FROM (p_d_m pdm) 
        LEFT JOIN i_card ic ON ic.i_card_id = pdm.i_card_id
        LEFT JOIN disease ds ON ds.disease_id = pdm.disease_id 
        LEFT JOIN village v ON v.village_id = ic.village_id 
        LEFT JOIN phc p ON p.phc_id = v.phc_id 
        LEFT JOIN ind_card indc ON indc.ind_card_id = pdm.ind_card_id 
        LEFT JOIN block b ON b.block_id = p.block_id 
        LEFT JOIN sub_district s ON s.sub_district_id =b.sub_district_id 
        LEFT JOIN district d ON d.district_id = s.district_id 
    GROUP BY ds.disease_id

我可以通过什么方式更改查询,以便我可以使用所有连接并且不会花费太多时间。

最佳答案

为什么不将查询结果放在数据库 View 中,然后从创建的 View 中选择 *

关于具有多个左连接的 mysql 查询需要大量时间来获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58503330/

相关文章:

mysql - 我如何在mysql中同时将数据从源插入到两个或多个表...有什么方法可以插入

javascript - Google 可视化仪表板错误

javascript - 使用数据表jquery在codeigniter中"Undefined table data"

mysql - SQL 查询返回列值高于某个最小值(具体取决于类别)的行?

php - MYSQL 查询到 Codeigniter 查询

java - Primefaces DataTable+LazyDataModel 不会在请求范围内传递 setPropertyActionListener

javascript - 水平滚动时水平 float div - CSS/Jquery

php - 我的代码有什么问题?

由于已设置的 NOT NULL 字段,MySQL DUPLICATE KEY UPDATE 无法更新

android - 尝试使用 where 子句时内容解析器 .query 出现问题