如何优化这个复杂的EAV MYSQL查询? [英] How to optimize this complicated EAV MYSQL query?

查看:303
本文介绍了如何优化这个复杂的EAV MYSQL查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以优化我所写的查询

Is it possible to optimize this query I have written

我已经创建了一种动态虚拟数据库,使我的用户能够添加自定义字段而不会影响数据库结构。到目前为止,这是一个非常简化的结构视图。

I've created a sort of dynamic virtual database to give my users the ability to add custom fields without affecting the database structure. Here is a very simplified view of the stucture so far.

tables         | columns







db_cases       | caseid
db_structure   | fieldname
db_data        | fieldname, data, caseid
db_names       | nameid




  • 我们可以通过向db_structure添加一行来创建一个新字段

  • 我们希望记录的任何数据记录到db_data。

  • 名称存储在db_names中,name_id存储在db_data

  • 我正在尝试将案例输出到html表

    I am trying to output the cases to a html table

    希望其余的是自我解释,你可以看到它是多么无效。我可以通过连接做同样的事情吗?

    Hopefully the rest is self explanatory, you can see how unefficient it is. Can I do the same thing via joins?

    SELECT 
    case_id,
    (SELECT data_field_value 
     FROM db_data 
     WHERE data_case_id = case_id AND data_field_name = 'casestatus'
    ) AS casestatus,
    (SELECT forename_company 
     FROM db_names 
     WHERE name_id = (SELECT data_field_value 
                      FROM db_data 
                      WHERE data_case_id = case_id AND data_field_name = 'client1'
                     )
    ) AS client1_forename_company
    FROM db_cases 
    

    谢谢

    推荐答案

    实际上,Chibuzo是对的。开始删除它:-))但之前,玩一点,这是一个很好的脑力,像棋或东西: - )

    Actually, Chibuzo is right. Start by deleting it :-)) But before, play with it a little, it's a good brain excercise, like chess or something :-)

    select 
        case_id,
        d_status.data_field_value as case_status,
        d_client1_name.forename_company as client1_forename_company
    from db_cases 
            join db_data as d_status 
                on d_status.data_case_id = case_id 
                   AND d_status.data_field_name = 'casestatus'
            join db_data as d_client1
                on d_client1.data_case_id = case_id 
                   AND d_client1.data_field_name = 'client1'
            join db_names as d_client1_name
                on d_client1_name.name_id = d_client1.data_field_value
    

    我希望这些直接加入没有子查询的效率要高得多,虽然你必须测试它 - 经常会有惊喜的优化。

    I would expect these direct joins without subqueries to be much more efficient, though you'll have to test it - there are often surprises in optimizations.

    这篇关于如何优化这个复杂的EAV MYSQL查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆