MySQL查询性能帮助,许多相同的表被连接
我正在编写一个创建SQL查询的PHP脚本。该脚本和数据库用于Joomla CMS,特别是它查询SOBIPro组件的表(使用在该组件中输入的数据)。但是,由于SOBI Pro表的处理方式,字段的每个实例都是表中自己的行,这意味着为我要提取的每个字段包含一个单独的表实例。这似乎不是很有效,事实上,在这一次搜索中,它超时了 SQL查询如下(这是由我的PHP代码生成的):MySQL查询性能帮助,许多相同的表被连接,mysql,performance,joomla,Mysql,Performance,Joomla,我正在编写一个创建SQL查询的PHP脚本。该脚本和数据库用于Joomla CMS,特别是它查询SOBIPro组件的表(使用在该组件中输入的数据)。但是,由于SOBI Pro表的处理方式,字段的每个实例都是表中自己的行,这意味着为我要提取的每个字段包含一个单独的表实例。这似乎不是很有效,事实上,在这一次搜索中,它超时了 SQL查询如下(这是由我的PHP代码生成的): 很多时候,当您有一个过度扩展的JOIN/JOIN/JOIN/etc时,SQL引擎会自顾不暇地试图找到小的结果集,并以一种效率较低的方
很多时候,当您有一个过度扩展的JOIN/JOIN/JOIN/etc时,SQL引擎会自顾不暇地试图找到小的结果集,并以一种效率较低的方式反向链接。你的问题看起来不错 您的主表(来自作为o的jos_sobipro_对象)实际上是查询的关键驱动元素。尝试使用MySQL添加“STRAIGHT_JOIN”特殊关键字 选择“直线连接”和“不同”。。。查询的其余部分 STRAIGHT_JOIN告诉优化器按照我在这里列出的顺序执行查询。如果知道第一个表是查询数据的主要表,那么它将更快地工作 这就是说,我并没有确切地看到索引信息,我会专门在jos_sobipro_field_数据上建立一个索引,以通过(SID,FID)获取“查找”数据
我不得不用类似的方法处理主表中1400多万条记录的政府数据,并连接到22+个查找表。MySQL将在30多小时后挂起。通过添加直接连接,查询大约在3小时内完成(正如它所做的那样)。对此查询运行sql解释,将输出发布到主文本中。解释添加到主文本中的输出。是否在
baseData
列上有索引?一般来说,发布该表的整个模式可能会有所帮助。
SELECT DISTINCT o.id AS entryid, o.parent AS parentID, name.baseData AS title,business.baseData AS business_data,
contact_fn.baseData AS contact_fn_data ,contact_ln.baseData AS contact_ln_data ,position.baseData AS position_data,
civic1.baseData AS civic1_data ,civic2.baseData AS civic2_data ,mailing.baseData AS mailing_data,
community.baseData AS community_data ,municip.baseData AS municip_data ,county.baseData AS county_data,
province.baseData AS province_data ,country.baseData AS country_data ,postal.baseData AS descr_data,
phone.baseData AS phone_data ,tollfree.baseData AS tollfree_data ,fax.baseData AS fax_data,
email.baseData AS email_data ,web.baseData AS web_data ,empTotal.baseData AS empTotal_data
FROM jos_sobipro_object AS o
INNER JOIN jos_sobipro_field_data AS name ON name.sid = o.id
INNER JOIN jos_sobipro_relations AS r ON o.id = r.id
LEFT JOIN jos_sobipro_field_data AS business ON business.sid = o.id AND business.fid = 36
LEFT JOIN jos_sobipro_field_data AS contact_fn ON contact_fn.sid = o.id AND contact_fn.fid = 74
LEFT JOIN jos_sobipro_field_data AS contact_ln ON contact_ln.sid = o.id AND contact_ln.fid = 75
LEFT JOIN jos_sobipro_field_data AS position ON position.sid = o.id AND position.fid = 76
LEFT JOIN jos_sobipro_field_data AS civic1 ON civic1.sid = o.id AND civic1.fid = 77
LEFT JOIN jos_sobipro_field_data AS civic2 ON civic2.sid = o.id AND civic2.fid = 78
LEFT JOIN jos_sobipro_field_data AS mailing ON mailing.sid = o.id AND mailing.fid = 79
LEFT JOIN jos_sobipro_field_data AS community ON community.sid = o.id AND community.fid = 80
LEFT JOIN jos_sobipro_field_data AS municip ON municip.sid = o.id AND municip.fid = 81
LEFT JOIN jos_sobipro_field_data AS county ON county.sid = o.id AND county.fid = 82
LEFT JOIN jos_sobipro_field_data AS province ON province.sid = o.id AND province.fid = 83
LEFT JOIN jos_sobipro_field_data AS country ON country.sid = o.id AND country.fid = 84
LEFT JOIN jos_sobipro_field_data AS postal ON postal.sid = o.id AND postal.fid = 85
LEFT JOIN jos_sobipro_field_data AS phone ON phone.sid = o.id AND phone.fid = 86
LEFT JOIN jos_sobipro_field_data AS tollfree ON tollfree.sid = o.id AND tollfree.fid = 87
LEFT JOIN jos_sobipro_field_data AS fax ON fax.sid = o.id AND fax.fid = 88
LEFT JOIN jos_sobipro_field_data AS email ON email.sid = o.id AND email.fid = 89
LEFT JOIN jos_sobipro_field_data AS web ON web.sid = o.id AND web.fid = 90
LEFT JOIN jos_sobipro_field_data AS empTotal ON empTotal.sid = o.id AND empTotal.fid = 106
WHERE o.approved = 1 AND o.oType = 'entry' AND name.fid = 36 AND name.baseData <> ''
AND name.section = 54 AND r.pid IN (415,418,425,431,458) AND (municip.baseData = "Municipality Name")
ORDER BY name.baseData ASC
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE name ref PRIMARY PRIMARY 8 const,const 15 Using where; Using temporary; Using filesort
1 SIMPLE municip ref PRIMARY PRIMARY 4 const 9 Using where
1 SIMPLE o eq_ref PRIMARY,oType PRIMARY 4 [[dbname]].municip.sid 1 Using where
1 SIMPLE county ref PRIMARY PRIMARY 4 const 10
1 SIMPLE province ref PRIMARY PRIMARY 4 const 10
1 SIMPLE country ref PRIMARY PRIMARY 4 const 8
1 SIMPLE postal ref PRIMARY PRIMARY 4 const 9
1 SIMPLE business ref PRIMARY PRIMARY 4 const 15
1 SIMPLE contact_fn ref PRIMARY PRIMARY 4 const 9
1 SIMPLE contact_ln ref PRIMARY PRIMARY 4 const 9
1 SIMPLE position ref PRIMARY PRIMARY 4 const 9
1 SIMPLE civic1 ref PRIMARY PRIMARY 4 const 10
1 SIMPLE civic2 ref PRIMARY PRIMARY 4 const 9
1 SIMPLE phone ref PRIMARY PRIMARY 4 const 10
1 SIMPLE tollfree ref PRIMARY PRIMARY 4 const 9
1 SIMPLE fax ref PRIMARY PRIMARY 4 const 10
1 SIMPLE email ref PRIMARY PRIMARY 4 const 9
1 SIMPLE mailing ref PRIMARY PRIMARY 4 const 11
1 SIMPLE community ref PRIMARY PRIMARY 4 const 9
1 SIMPLE web ref PRIMARY PRIMARY 4 const 10
1 SIMPLE empTotal ref PRIMARY PRIMARY 4 const 10
1 SIMPLE r ref PRIMARY PRIMARY 4 [[dbname]].name.sid 3 Using where; Using index; Distinct