Mysql离开加入很慢

时间:2014-02-20 16:42:30

标签: mysql sql

我有一个左连接:

$query = "SELECT a.`id`, a.`documenttitle`, a.`committee`, a.`issuedate`, b.`tagname`
   FROM `#__document_management_documents` AS a 
   LEFT JOIN `#__document_managment_tags` AS b 
   ON a.id = b.documentid 
   ".$tagexplode."
   ".$issueDateText."
   AND a.committee in (".$committeeQueryTextExplode.")
   AND a.documenttitle LIKE '".$documentNameFilter."%'
   GROUP BY a.id ORDER BY a.documenttitle ASC

  ";

在4000条记录中,它的速度非常慢,仅为7秒

任何想法我可能做错了

SELECT a.`id`, a.`documenttitle`, a.`committee`, a.`issuedate`, b.`tagname` 
FROM `w4c_document_management_documents` AS a 
LEFT JOIN `document_managment_tags` AS b 
ON a.id = b.documentid WHERE a.issuedate >= '' 
AND a.committee in ('1','8','9','10','11','12','13','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47') 
AND a.documenttitle LIKE '%' GROUP BY a.id ORDER BY a.documenttitle ASC

3 个答案:

答案 0 :(得分:0)

我会在a.committee上放一个索引,而全文索引doctitle col。 IN和LIKE是我的直接标志。发行日期也应该有索引,因为您是> = it

答案 1 :(得分:0)

尝试在MySQL客户端中运行以下命令:

show index from #__document_management_documents;
show index from #_document_management_tags;

检查各个表的iddocumentid字段中是否有键/索引。如果没有,MySQL将进行全表扫描以查找值。在这些字段上创建索引会使搜索时间成为对数,因为它会将它们排序到存储在索引文件中的二叉树中。更好的是使用主键(如果可能的话),因为行数据存储在叶子中,这样可以节省MySQL另外的I / O操作来查找数据。

也可能只是IN和> =运算符的性能不佳,在这种情况下,您可能需要重写查询或重新设计表。

答案 2 :(得分:0)

如上所述,尝试查找列是否具有索引。您甚至可以在查询开始时在MySQL客户端中执行“EXPLAIN”命令,以查看查询是否实际使用索引。您将在“关键”列和“额外”列中看到。获取更多信息here

这有助于您优化查询。还使用临时和文件排序分组原因,这会导致MySQL创建临时表并遍历每一行。如果你可以使用PHP进行分组,那就更快了。