需要微调我在varchar列上有索引的mysql查询

时间:2012-01-03 11:59:42

标签: mysql sql performance

我有一张几乎 2,000,000 记录的表格。 我有一个列(crmid),它是该表中的varchar。 我写了一个查询  比方说,

 Select column1, column2,..... from table where crmid = ?

价值来自前端。以前它工作正常,但现在它正在从前端超时。 然后我在该列上使用了一个索引,甚至对我没什么帮助。 索引后我解释了查询,再次使用索引遍历 1,800,000行

请帮助我微调这个查询。

注意:这不是实际的查询,它只是最简单的形式。实际查询中有许多连接。

EDITED :: 完整查询是

select  column1
        , column2 
from    table1 a
        inner join appointmentstatusmst st 
            on  st.entity_id = a.shdstatuslviid 
        inner join hlcclientdetails 
            on  a.shdclientid = hlcclientdetails.cldregno 
            and a.shdclientdcnid = hlcclientdetails.clddcnid
where   hlcclientdetails.cldunifiedcrmid = ?

解释输出为

1 个答案:

答案 0 :(得分:3)

appointmentstatusmst.entityid上有索引吗?在table1.shdclientidtable1.shdclientdcnid上怎么样?在hlcclientdetails.cldregnohlcclientdetails.clddcnid上怎么样?

为使您的联接顺利进行,您需要在连接条件中所涉及的列上以及您用于选择输出行的列上建立索引。

@Bohemian是正确的,这是一个中等大小的问题。

EDIT。

考虑一下mySQL服务器实际执行查询所需要做的事情可能会有所帮助。

 where hlcclientdetails.cldunifiedcrmid = ? 

意味着它必须在hlcclientdetails表中查找某些行。因此cldunifiedcrmid上的索引会让它有效地执行此操作。你已经提到你已经有了这个索引。好。

继续前进,

   inner join hlcclientdetails 
              on  a.shdclientid = hlcclientdetails.cldregno 
             and  a.shdclientdcnid = hlcclientdetails.clddcnid

表示必须查看hlcclientdetails表格中的行,并通过查看table1 aa.shdclientdcnid将其与a.shdclientid相匹配。因此,对于这两列,您的查询可能会受益于table1 a中的复合索引。您应该尝试添加该索引,并查看性能是否会变得更好。

最后,

inner join appointmentstatusmst st 
           on  st.entity_id = a.shdstatuslviid 

表示服务器必须获取它在table1 a中找到的行,并将它们与第三个表匹配。您在评论中提到entity_id是该表的PK。那会有所帮助。

我希望你能得到这个想法。索引不仅有助于WHERE子句,还有ON子句。

顺便说一下,另一个答案中提到的全文索引对你遇到的这个JOIN性能问题没有帮助。