MySQL查询性能限制?

MySQL查询性能限制?,mysql,Mysql,我们有一个自己开发的文档管理系统,我们的系统运行非常缓慢,尤其是在搜索方面。它一开始运行得很好,但随着时间的推移,速度逐渐变慢。根据标准,现在返回结果需要30到150秒的时间。这是我们的搜索查询。我们一直在左顾右盼,看不到任何地方可以调整这个。所有连接的字段都在各自的表上建立索引 SELECT DISTINCT f.*, ts.*, fo.*, ft.*, p.*, u.*, c.*, co.*, ct.*, fs.*, fd.*, r.*, rt.*, si.*, s.* FROM ( SEL

我们有一个自己开发的文档管理系统,我们的系统运行非常缓慢,尤其是在搜索方面。它一开始运行得很好,但随着时间的推移,速度逐渐变慢。根据标准,现在返回结果需要30到150秒的时间。这是我们的搜索查询。我们一直在左顾右盼,看不到任何地方可以调整这个。所有连接的字段都在各自的表上建立索引

SELECT DISTINCT f.*, ts.*, fo.*, ft.*, p.*, u.*, c.*, co.*, ct.*, fs.*, fd.*, r.*, rt.*, si.*, s.* FROM (
SELECT DISTINCT f.* FROM files f
JOIN folders fo ON(fo.id = f.belongs_to_folder_id)
JOIN projects p ON(p.id = f.belongs_to_project_id)
LEFT OUTER JOIN file_statuses fs ON(fs.id = f.file_status_id)
LEFT OUTER JOIN submittal_items_files sif ON(sif.file_id = f.id)
LEFT OUTER JOIN submittal_items si ON(si.id = sif.submittal_item_id)
LEFT OUTER JOIN submittals s ON(s.id = si.belongs_to_submittal_id)
LEFT OUTER JOIN record_types rt ON(rt.id = f.record_type_id)
LEFT OUTER JOIN companies co ON(co.id = f.company_id)
LEFT JOIN folders_actions_groups ag ON (
    f.belongs_to_folder_id = ag.folder_id AND
    ag.action_id = 10010
)
LEFT JOIN files_actions_groups fg ON (fg.file_id = f.id)
JOIN users_groups ug ON ((ug.group_id = ag.group_id OR ug.group_id = fg.group_id) AND ug.user_id = 411)
WHERE (
    (f.file_generated_name LIKE CONCAT('%', 'the', '%')) OR 
    (f.record_id LIKE CONCAT('%', 'the', '%')) OR 
    (f.record_title LIKE CONCAT('%', 'the', '%')) OR 
    (f.additional_info LIKE CONCAT('%', 'the', '%')) OR 
    (si.item_number LIKE CONCAT('%', 'the', '%')) OR 
    (s.element_number LIKE CONCAT('%', 'the', '%'))
) AND f.path LIKE CONCAT('Some Text', '%') AND 
f.file_status_id = 3 AND 
f.file_revision = 1 AND 
f.discipline_id = 1 AND 
f.record_type_id = 2 AND 
f.triage_status_id = 2 AND 
f.deleted = 0 
ORDER BY f.created DESC, f.id DESC  
LIMIT 100
) AS f
LEFT OUTER JOIN users u ON(f.created_by_user_id = u.id)
LEFT OUTER JOIN contacts c ON(c.user_id = u.id)
LEFT OUTER JOIN companies co ON(co.id = f.company_id)
LEFT OUTER JOIN company_types ct ON(ct.id = co.company_type_id)
JOIN triage_statuses ts ON(f.triage_status_id = ts.id)
JOIN folders fo ON(fo.id = f.belongs_to_folder_id)
JOIN folder_types ft ON(ft.id = fo.folder_type_id)
JOIN projects p ON(p.id = f.belongs_to_project_id)
LEFT OUTER JOIN file_statuses fs ON(fs.id = f.file_status_id)
LEFT OUTER JOIN file_disciplines fd ON(fd.id = f.discipline_id)
LEFT OUTER JOIN revisions r ON(r.id = f.file_revision)
LEFT OUTER JOIN record_types rt ON(rt.id = f.record_type_id)
LEFT OUTER JOIN submittal_items_files sif ON(sif.file_id = f.id)
LEFT OUTER JOIN submittal_items si ON(si.id = sif.submittal_item_id)
LEFT OUTER JOIN submittals s ON(s.id = si.belongs_to_submittal_id)
LEFT OUTER JOIN files_actions_groups ffg ON(ffg.file_id = f.id)
LEFT OUTER JOIN groups g ON(g.id = ffg.group_id)
ORDER BY f.created DESC, f.id DESC

这可能是一个显而易见的答案,但您是否为数据库编制了索引?如果您不熟悉索引,这里有一个很好的规则:只需在所有名为“id”的列上放置一个唯一的索引,例如folders.id或projects.id,然后在所有引用外来id的列上放置一个标准索引,例如folder.pensides\u to\u folder\u id或folder.record\u type\u id

我想做的另一件事是尝试只选择实际使用的列,而不是大量的
f.*、ts.*、fo.*、ft.*、p.*、u.*、c.*、co.*、ct.*、fs.*等。


您还有大量的连接,这在处理时间方面非常昂贵。您真的需要所有这些联接表吗?

这可能是一个显而易见的答案,但您是否为数据库编制了索引?如果您不熟悉索引,这里有一个很好的规则:只需在所有名为“id”的列上放置一个唯一的索引,例如folders.id或projects.id,然后在所有引用外来id的列上放置一个标准索引,例如folder.pensides\u to\u folder\u id或folder.record\u type\u id

我想做的另一件事是尝试只选择实际使用的列,而不是大量的
f.*、ts.*、fo.*、ft.*、p.*、u.*、c.*、co.*、ct.*、fs.*等。


您还有大量的连接,这在处理时间方面非常昂贵。您真的需要所有这些连接的表吗?

您需要返回所有这些数据吗?每个联接表中的每个列?我还建议找到一种方法来排除重复的
比如CONCAT(“%”、“%”、“%”、“%”)
子句。使用
EXPLAIN
EXPLAIN EXTENDED
来查看成本是多少?查看全文搜索或使用类似sphinx的东西mysqlAll的强大文本搜索在我看来很好,无法想象为什么会出现性能问题。也许,如果您加入更多的表,将使事情再次移动?您需要返回所有这些数据吗?每个联接表中的每个列?我还建议找到一种方法来排除重复的
比如CONCAT(“%”、“%”、“%”、“%”)
子句。使用
EXPLAIN
EXPLAIN EXTENDED
来查看成本是多少?查看全文搜索或使用类似sphinx的东西mysqlAll的强大文本搜索在我看来很好,无法想象为什么会出现性能问题。也许,如果您再加入几个表,就会使事情再次发生变化?加入中涉及的所有字段都被编入索引。我想我可以限制一些领域。
*
维护率低,是否会对性能造成如此大的影响?这些表都有我们必须在搜索结果上显示的值,因此我们确实需要连接。有没有更有效的方法?联接中涉及的所有字段都被索引。我想我可以限制一些领域。
*
维护率低,是否会对性能造成如此大的影响?这些表都有我们必须在搜索结果上显示的值,因此我们确实需要连接。有没有更有效的方法?