0

我有这个非常慢的 MySQL 查询,我想是因为所有的 JOIN(看起来很复杂,但这是很多表的问题):

SELECT DISTINCT doctors.doc_id, 
    doctors.doc_user, 
    doctors.doc_first, 
    doctors.doc_last, 
    doctors.doc_email, 
    doctors.doc_notes, 
    titles.tit_name, 
    specializations.spe_name, 
    activities.act_name, 
    users.use_first, 
    users.use_last,
    (SELECT COUNT(*) FROM locations WHERE locations.loc_doctor = doctors.doc_id) AS loc_count,
    (SELECT COUNT(*) FROM reception WHERE reception.rec_doctor = doctors.doc_id) AS rec_count,
    (SELECT COUNT(*) FROM visits INNER JOIN reports ON visits.vis_report = reports.rep_id  WHERE visits.vis_doctor = doctors.doc_id AND reports.rep_user LIKE '%s') AS vis_count
FROM
    doctors
INNER JOIN titles ON titles.tit_id = doctors.doc_title
INNER JOIN specializations ON specializations.spe_id = doctors.doc_specialization
INNER JOIN activities ON activities.act_id = doctors.doc_activity
LEFT JOIN locations ON locations.loc_doctor = doctors.doc_id
INNER JOIN users ON doctors.doc_user = users.use_id
WHERE
    ((doctors.doc_last LIKE %s) OR (doctors.doc_first LIKE %s) OR (doctors.doc_email LIKE %s)) 
    AND doctors.doc_user LIKE %s 
    AND locations.loc_province LIKE %s 
    AND doctors.doc_specialization LIKE %s 
    AND doctors.doc_activity LIKE %s 
ORDER BY %s

所有 %s 都是 sprintf() PHP 函数中
的参数 最重要的是要注意...我在 MySQL 上没有索引!我想我可以加快添加一些索引的过程......但是什么和在哪里?有太多的连接和搜索参数,我对什么是有效的感到困惑:-)

请问你能帮忙吗?提前致谢!

4

2 回答 2

0

您可以从在 where 条件中使用的那些列上添加索引开始。

此外,您应该索引那些在连接中使用的字段,即主键和外键列。

我建议逐步试验这些索引会产生真正的性能提升。

此外,我观察到您在单个查询中获取了太多数据。如果确实不需要,请将其分解为不同的报告和页面(如果可能),因为即使您进行了适当的索引,该解决方案也不会具有很好的可扩展性并且可能无法处理大量数据。

注意:您可能必须在通过 '%' 限定符查询的字段上创建全文索引。(即使用 LIKE 运算符)

于 2012-10-05T10:49:03.173 回答
0

就像运营商很慢。这是关于应用索引和全文的讨论

mysql 喜欢性能提升

于 2012-10-05T10:50:47.573 回答