Mysql SQL中大数据左连接选择查询的优化

Mysql SQL中大数据左连接选择查询的优化,mysql,sql,sql-server,Mysql,Sql,Sql Server,我想知道是否有更快或更好的方法来处理以下情况: 目前,我发现自己正在努力优化冗长的select查询的执行时间,我需要为每条记录的每个唯一字段进行左连接(基本上是旋转表)。有没有一种方法可以通过一个连接/透视将此最小化,从而减少检索数据所需的时间 我需要预留50个自定义字段,这些字段在30000多条记录上超时(相关列上有索引) 我将感谢任何帮助(包括更正标题,因为我不知道如何声明),提前感谢 下面是设置一个小示例的代码: Create Table CustomField ( ID int iden

我想知道是否有更快或更好的方法来处理以下情况:

目前,我发现自己正在努力优化冗长的select查询的执行时间,我需要为每条记录的每个唯一字段进行左连接(基本上是旋转表)。有没有一种方法可以通过一个连接/透视将此最小化,从而减少检索数据所需的时间

我需要预留50个自定义字段,这些字段在30000多条记录上超时(相关列上有索引)

我将感谢任何帮助(包括更正标题,因为我不知道如何声明),提前感谢

下面是设置一个小示例的代码:

Create Table CustomField (
ID int identity (1,1) Not Null,
FieldName varchar(50) Not null,
FieldOrderNumber int Not Null);

ALTER TABLE [dbo].[CustomField] ADD  CONSTRAINT [PK_CustomField] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]


首先,需要在标识列上创建索引。然后在要加入的列上创建索引。这些提示将缩短执行时间。

您需要在要加入的列上添加索引。另外,请用您正在使用的DBMS标记问题:MySQL、SQL Server、Oracle等。我已经在数据库中为相关表建立了索引。您发布了
CREATE TABLE
语句,它们没有提到任何索引。发布索引创建语句,以便我们查看您是否有正确的索引。问题中添加了索引。我在帖子中添加了索引,相关表中的索引问题我遇到了问题
Create Table FieldValue (
ID int identity (1,1) Not Null,
CustomFieldID int Not Null,
PersonID int Not Null, 
FieldValue varchar(50));

ALTER TABLE [dbo].[FieldValue ] ADD  CONSTRAINT [PK_FieldValue] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
Create Table Person (
ID int identity (1,1) Not Null,
PersonName varchar (50) Not Null);

ALTER TABLE [dbo].[Person] ADD  CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
Insert into Person (PersonName)
Values ('Marc');

Insert into Person (PersonName)
Values ('John');

Insert into CustomField (FieldName, FieldOrderNumber)
Values ('BloodType',1);

Insert into CustomField (FieldName, FieldOrderNumber)
Values ('EyeColour',2);

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (1,1, 'A+');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (1,2, 'O-');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (2,1, 'Blue');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (2,2, 'Hazel');



WITH ListFieldValues (FieldOrderNumber, FieldName, PersonID, FieldValue)
AS
(
SELECT cf.FieldOrderNumber, cf.FieldName, fv.PersonID, fv.FieldValue
FROM CustomField cf LEFT JOIN FieldValue fv ON cf.ID = fv.CustomFieldID
)


SELECT p.ID,
    p.PersonName,
    lvf.FieldValue AS Column1, --Bloodtype
    lvf2.FieldValue as Column2 --EyeColour    
FROM Person p 
LEFT JOIN ListFieldValues lvf ON p.ID = lvf.PersonID and lvf.FieldOrderNumber =1 
LEFT JOIN ListFieldValues lvf2 on p.ID = lvf2.PersonID and lvf2.FieldOrderNumber = 2