我有一张几乎 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 = ?
解释输出为
答案 0 :(得分:3)
appointmentstatusmst.entityid
上有索引吗?在table1.shdclientid
和table1.shdclientdcnid
上怎么样?在hlcclientdetails.cldregno
和hlcclientdetails.clddcnid
上怎么样?
为使您的联接顺利进行,您需要在连接条件中所涉及的列上以及您用于选择输出行的列上建立索引。
@Bohemian是正确的,这是一个中等大小的问题。
EDIT。
考虑一下mySQL服务器实际执行查询所需要做的事情可能会有所帮助。
where hlcclientdetails.cldunifiedcrmid = ?
意味着它必须在hlcclientdetails
表中查找某些行。因此cldunifiedcrmid
上的索引会让它有效地执行此操作。你已经提到你已经有了这个索引。好。
继续前进,
inner join hlcclientdetails
on a.shdclientid = hlcclientdetails.cldregno
and a.shdclientdcnid = hlcclientdetails.clddcnid
表示必须查看hlcclientdetails
表格中的行,并通过查看table1 a
和a.shdclientdcnid
将其与a.shdclientid
相匹配。因此,对于这两列,您的查询可能会受益于table1 a
中的复合索引。您应该尝试添加该索引,并查看性能是否会变得更好。
最后,
inner join appointmentstatusmst st
on st.entity_id = a.shdstatuslviid
表示服务器必须获取它在table1 a
中找到的行,并将它们与第三个表匹配。您在评论中提到entity_id是该表的PK。那会有所帮助。
我希望你能得到这个想法。索引不仅有助于WHERE子句,还有ON子句。
顺便说一下,另一个答案中提到的全文索引对你遇到的这个JOIN性能问题没有帮助。