【问题标题】:MYSql Query - #2013 - Lost connection to MySQL server during queryMYSql 查询 - #2013 - 查询期间与 MySQL 服务器的连接丢失
【发布时间】:2015-11-22 08:43:09
【问题描述】:

我有一个很长的查询,其中包含多个已超时的连接。我已经在所有赞助商表中创建了Sponsor_Id(在WHERE 中使用)作为索引。分析器图表显示速度极慢(发送数据的时间为 75%)。


这里是查询:

SELECT GROUP_CONCAT(DISTINCT masterdetail.eventid) as eventids
FROM   tblsponsor_slave_eventprefrencesdetail userprefrence
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_category
                  userprefcategory
               ON userprefrence.SponsorId = userprefcategory.SponsorId
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_locationtarget
                  userpreflocation
               ON userprefrence.SponsorId = userpreflocation.SponsorId
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_type userprefEventType
               ON userprefrence.SponsorId = userprefEventType.SponsorId
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_audienceprofile
                  userprefAudiProfile
               ON userprefrence.SponsorId = userprefAudiProfile.SponsorId
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_industry
                  userprefIndustry
               ON userprefrence.SponsorId = userprefIndustry.SponsorId
       INNER JOIN tblsponsor_slave_eventprefrencesdetail userprefdetail
               ON userprefrence.SponsorId = userprefdetail.SponsorId
       INNER JOIN tblsponsor_slave_sponsor_eventprefrence_audiencetype
                  userprefAudiType
               ON userprefrence.SponsorId = userprefAudiType.SponsorId
       INNER JOIN tblsponsor_slave_eventprefrence_agegroup userprefAgeGroup
               ON userprefrence.SponsorId = userprefAgeGroup.SponsorId
       INNER JOIN tblevent_slave_event_address_city eventcity
               ON userpreflocation.Sponsor_EventPrefrence_LocationTarget =
                  eventcity.Event_Address_City
       INNER JOIN tblevent_slave_event_audienceprofile eventAudiProfile
               ON userprefAudiProfile.Sponsor_EventPrefrence_AudienceProfile =
                  eventAudiProfile.Event_AudienceProfile
       INNER JOIN tblevent_slave_event_industrycatered eventindustry
               ON userprefIndustry.Sponsor_EventPrefrence_Industry =
                  eventindustry.Event_IndustryCatered
       INNER JOIN tblevent_slave_agegroup eventagegroup
               ON userprefAgeGroup.Sponsor_AgeGroup_Type =
                  eventagegroup.Event_AgeGroup_Type
                  AND userprefAgeGroup.IsExist = eventagegroup.IsExist
       INNER JOIN tblevent_master_detail masterdetail
               ON eventcity.EventId = masterdetail.EventId
       INNER JOIN tblevent_slave_others eventothers
               on masterdetail.EventId = eventothers.EventId
                  AND masterdetail.Event_Category =
                      userprefcategory.Sponsor_EventPrefrence_Category
                  AND masterdetail.Event_Type =
                      userprefEventType.Sponsor_EventPrefrence_Type
                  AND eventothers.Event_Gender =
                      userprefdetail.Sponsor_EventPrefrence_Gender
                  AND eventothers.Event_TargetAudience =
                      userprefAudiType.Sponsor_EventPrefrence_AudienceType
                  AND eventothers.Event_Sponsor_Range_Min <
                      userprefrence.Sponsor_EventPrefrence_Range_Max
WHERE  userprefrence.SponsorId = 164
       AND eventagegroup.IsExist = 1
       AND masterdetail.Event_StartDateTime > '2015-08-27'
       AND masterdetail.Event_Category in ( "1", "2", "3", "7",
                                            "9", "10", "11" )
       AND eventcity.Event_Address_City in ( "1", "3", "54" )
       AND masterdetail.Event_Type in ( "2", "3", "4", "5", "7" )
       AND eventindustry.Event_IndustryCatered in ( "13", "18" )
       AND eventAudiProfile.Event_AudienceProfile in ( "1", "2", "10" ) 

【问题讨论】:

  • 发布您查询中的解释。我不明白查询是“仅”慢还是您失去了与数据库的连接
  • 您可以尝试将my.cnf中“max_allowed_pa​​cket”的Value改成更高的值来修复。
  • max_allowed_pa​​cket 可能不是原因...您的 /var/log/messages 怎么说?是因为OOM而杀死Mysql吗?您的缓冲区/缓存设置可能需要调整...
  • 谢谢,我在共享主机上并使用 phpmyadmin。不确定如何更改这些变量的值。
  • 对索引有帮助吗?我怀疑我的表没有正确索引。

标签: mysql join indexing


【解决方案1】:

优化器将(可能)从通过WHERE 子句中的内容进行最佳过滤的表开始。哪个看起来最有选择性?假设它是masterdetail.Event_StartDateTime &gt; '2015-08-27'。然后你需要在masterdetail 上的索引开始Event_StartDateTime

然后它会移动到另一个表。它可能会看到:

ON eventcity.EventId = masterdetail.EventId

暗示eventcity 是下一个表,它需要以某种方式进入。闻起来像EventIdPRIMARY KEY;因此无需采取进一步行动。

然后到下一张桌子。接下来。等等。

这些WHERE 子句需要讨论一下:

userprefrence.SponsorId = 164
eventagegroup.IsExist = 1

它们是 column = constant,这使得它们非常适合索引。另一方面,IsExist 闻起来像一个真/假标志,在索引中本身几乎从来没有用过。

无论如何,可能使用字段处于JOINed on的字段的复合索引会很有用。

你能证明 15 桌 JOIN 的合理性吗?那是很多。 (“规范化,但不要过度规范化。”)

我瞎了眼 -- 你能否为每个人提供SHOW CREATE TABLE(在实施了我的建议之后)?

我给你的可能不是全部。

sending data 是无用的信息;他们需要以某种方式对其进行分解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2019-06-29
    • 2019-01-05
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多