一种高效的多连接MySQL查询方法

一种高效的多连接MySQL查询方法,mysql,performance,select,join,Mysql,Performance,Select,Join,我问这个问题的目的是希望有一种更有效(更快)的方法在我正在处理的表中提取和插入数据 数据表的基本结构是 ID Doc_ID Field Value 1 10 Title abc 2 10 Abstract xyz 3 10 Author Bob 4 11 Publisher Bookworms 5 11 Title zzz

我问这个问题的目的是希望有一种更有效(更快)的方法在我正在处理的表中提取和插入数据

数据表的基本结构是

    ID Doc_ID    Field     Value
     1    10    Title       abc
     2    10    Abstract    xyz
     3    10    Author      Bob
     4    11    Publisher   Bookworms
     5    11    Title       zzz
     6    11    Abstract    bbb
     7    12    Title       aaa
     8    12    Sale        No
换句话说,数据表是基于行的,每行包含一个文档id和相应的字段值。并非所有文档都定义了相同数量的字段。事实上,书籍可能与杂志截然不同

数据表有10000000行,通常一个文档有100个相关字段

因此,我发现的性能问题是拉取一个引用50多个不同字段的报表,例如,如果我在order_表中有一个查询列表,那么查询可能是这样的

    select ord.number as 'Order ID', d1.value as 'Title', d2.value as 'Author' .......
    from order_table ord
    LEFT JOIN data_table as d1 on d1.Doc_ID=ord.Doc_ID and d1.Field='Title'
    LEFT JOIN data_table as d2 on d2.Doc_ID=ord.Doc_ID and d2.Field='Author'
    ........
    LEFT JOIN data_table as d50 on d50.Doc_ID=ord.Doc_ID and d50.Field='Qty'
使用左连接,因为不能保证为该文档定义了字段

考虑到可能有一些WHERE参数将列表限制为项目(例如库存或低于价格),这是一个缓慢的查询。索引实际上并不多


在无法更改数据模型的情况下,提取大量信息的最佳方法是什么?

这称为“枢轴”。MySQL不像其他数据库那样内置了它,但如果你搜索“MySQL pivot”,你会找到更好的解决方案,因为这是一个常见的问题。这很好地解释了问题,我会看看我是否能做到这一点,并解决性能问题