为什么相同的MySQL查询对于不同的ID需要更长的时间?

为什么相同的MySQL查询对于不同的ID需要更长的时间?,mysql,performance,join,time,Mysql,Performance,Join,Time,这是我用来获取和显示我的配置文件页面数据的查询。每个类别都有自己的表,因为用户不断地将它们添加到表中。我是MYSQL新手,一定是做错了什么,因为对于一个提供者(id=56),查询需要0.7秒,而对于id=164的提供者,查询需要27秒(!!!)。我想他们两个都有相同数量的数据,所以我不明白为什么一个需要这么长时间 由于我是MySQL的新手,我不知道我的长查询是否正常,或者是否有一种我没有意识到的更短、更简单的方法。但是,它在我的所有提供者上都可以正常工作,只有一个除外 我对这两个问题都做了解释,

这是我用来获取和显示我的配置文件页面数据的查询。每个类别都有自己的表,因为用户不断地将它们添加到表中。我是MYSQL新手,一定是做错了什么,因为对于一个提供者(id=56),查询需要0.7秒,而对于id=164的提供者,查询需要27秒(!!!)。我想他们两个都有相同数量的数据,所以我不明白为什么一个需要这么长时间

由于我是MySQL的新手,我不知道我的长查询是否正常,或者是否有一种我没有意识到的更短、更简单的方法。但是,它在我的所有提供者上都可以正常工作,只有一个除外

我对这两个问题都做了解释,唯一的区别是慢查询中列出的“类型”有4个“ALL”,而快查询中只有2个,与列“Extra”相同——慢查询中有4个表示“使用where;使用连接缓冲区(块嵌套循环)”,快查询中有2个。我不知道这些是什么意思,但这正是我想弄明白的

谢谢你的帮助

更改/删除Concat和Distinct没有帮助

SELECT `providers`.`id`,
`providers`.`provider_first_name`, 
`providers`.`provider_last_name`,
`providers`.`p_date_added`,
`degrees`.`degree_type`,
GROUP_CONCAT(DISTINCT `degrees`.`degree_type` SEPARATOR ', ') AS 
all_degrees,
`specialties`.`specialty`,
GROUP_CONCAT(DISTINCT `specialties`.`specialty` SEPARATOR ', ') AS 
all_specialties,
`locations`.`city`, `locations`.`state`,
GROUP_CONCAT(DISTINCT CONCAT(`locations`.`city`, ', ', 
`locations`.`state`)
ORDER BY `locations`.`city`
SEPARATOR '<br>'
) AS all_locations,
`practices`.`practice_name`,
GROUP_CONCAT(DISTINCT `practices`.`practice_name` SEPARATOR '<br>') 
AS all_practices,
`links`.`link`,
GROUP_CONCAT(DISTINCT `links`.`link` SEPARATOR '<br>') AS 
all_links,
`conditions`.`condition_name`,
GROUP_CONCAT(DISTINCT `conditions`.`condition_name` SEPARATOR ', ') 
AS all_conditions,
`reviews`.`review`, `reviews`.`star_rating`, 
`reviews`.`r_date_added`,
AVG(`reviews`.`star_rating`) AS rating
FROM `providers`
LEFT JOIN `degrees` ON `providers`.`id` = `degrees`.`prov_id`
LEFT JOIN `specialties` ON `providers`.`id` = 
`specialties`.`prov_id`
LEFT JOIN `locations` ON `providers`.`id` = `locations`.`prov_id`
LEFT JOIN `practices` ON `providers`.`id` = `practices`.`prov_id`
LEFT JOIN `links` ON `providers`.`id` = `links`.`prov_id`
LEFT JOIN `conditions` ON `providers`.`id` = `conditions`.`prov_id`
LEFT JOIN `reviews` ON `providers`.`id` = `reviews`.`prov_id`
WHERE `id`= {$providerid}
GROUP BY `id`
选择“提供者”。`id`,
`提供者`.`provider\u first\u name`,
`提供者`.`provider\u last\u name`,
`提供者`.`p_date_added`,
`度`.`degree\u type`,
组_CONCAT(不同的'degrees'。'degree_类型'SEPARATOR',')如下
所有学位,
`“特产”.“特产”,
组_CONCAT(不同的'specializes'。'specialize'SEPARATOR',')作为
所有的特产,
`地点`.`city`、`locations`.`state`、,
组_CONCAT(不同的CONCAT(`locations`.`city`、`city`、`,
`位置`.`state`)
按“地点”排序。“城市”`
分隔符“
” )作为所有的工作地点, `练习`.`practice_name`, 组(不同的“实践”。“实践”名称“分隔符”
) 按照所有的惯例, `links`.`link`, 组(不同的'links'。'link'SEPARATOR'
')作为 所有链接, `条件“”。`condition\u name`, 组_CONCAT(不同的'conditions'。'condition_name'SEPARATOR',' 在所有情况下, `评论`.`review`、`reviews`.`star_rating`、, `评论`.`r\u date\u added`, 平均值(`reviews`.`star_rating`)作为评级 来自`供应商` 左连接“提供者”上的“度”。'id`='degrees`.'prov\u id` 左键连接“提供者”上的“专业”。`id`= `专业`.`prov\u id` 左连接“提供者”上的“位置”。'id`='locations`.'prov\u id` 左连接“提供者”上的“实践”。'id`='practices`.'prov\u id` 左连接“提供者”上的“链接”。'id`='links`.'prov\u id` 左连接“提供者”上的“条件”。'id`='conditions`.'prov\u id` 左连接“提供者”上的“评论”。'id`='reviews`.'prov\u id` 其中`id`={$providerid} 按`id分组`
解释查询

ALL表示它相当于表的完全扫描。要防止这种情况,请在表上添加索引。在通常用于搜索或连接某些数据的列上添加索引

表示索引记录中记录的基数。数字越小越好


阅读更多关于解释的内容确实有帮助。

解释查询

ALL表示它相当于表的完全扫描。要防止这种情况,请在表上添加索引。在通常用于搜索或连接某些数据的列上添加索引

表示索引记录中记录的基数。数字越小越好

阅读更多关于解释的内容确实很有帮助。

分解内爆--连接分解行数,然后
分组依据
分解为很少的行数(显然只有一行)

要避免这种情况,请将
左连接
移动到
选择中。例如:

SELECT ...
       GROUP_CONCAT(DISTINCT `degrees`.`degree_type` SEPARATOR ', ') AS all_degrees,
    ...
    LEFT JOIN  `degrees`  ON `providers`.`id` = `degrees`.`prov_id`
    ...
-->

最后的
分组id
可以删除

此时,
DISTINCT
可能是冗余的;尝试删除它。

分解内爆--
连接分解行数,然后
分组依据
分解为很少的行数(显然只有一行)

要避免这种情况,请将
左连接
移动到
选择中。例如:

SELECT ...
       GROUP_CONCAT(DISTINCT `degrees`.`degree_type` SEPARATOR ', ') AS all_degrees,
    ...
    LEFT JOIN  `degrees`  ON `providers`.`id` = `degrees`.`prov_id`
    ...
-->

最后的
分组id
可以删除


此时,
DISTINCT
可能是冗余的;尝试删除它。

好的,当我选择不带distinct的数据以查看每个ID连接了多少数据时,慢ID的数据量要大得多(几乎是3倍),但我不确定为什么,它是如何在数据中循环的?他们应该有大致相同数量的数据连接到他们身上……在应用程序代码中使用GROUP_CONCAT对我来说太疯狂了。好吧,当我选择数据而不使用distinct来查看每个ID连接了多少数据时,对于慢速ID,会有大量数据(几乎是3倍),但我不确定为什么,关于它是如何在数据中循环的?它们应该有大致相同数量的数据连接到它们……在应用程序代码中使用GROUP_CONCAT对我来说太疯狂了。这非常有效。然而,我的新问题是,如果我在搜索引擎查询中使用相同的结构,那么当(并且仅当)它们在特定搜索字段中输入某些内容时,我必须在查询中附加其他部分。通常我只做了$query.=“AND
city
LIKE:city”,但现在这些都在这些选择括号内,我不知道如何添加它们,只有当字段被填充时(如果你有任何想法,我已经在这里发布了这个问题:@mb9393-你需要PHP(或其他语言)基于用户输入构建查询的代码。这非常有效。但我的新问题是,如果我在搜索引擎查询中使用相同的结构,我必须在(且仅当)他们在特定搜索字段中输入内容时向查询添加其他部分。通常我刚刚完成$query.=“and
city
LIKE:city”但现在这些都在选择括号内,我不知道如何添加它们,只有在字段为