繁体   English   中英

我如何优化这个查询 MYSQL

[英]How can i optimize this query MYSQL

大家好,我有这个查询,但我不知道如何优化这个查询。 如果有人可以在这里指导我,我将不胜感激。

SELECT
    Jobs.id AS `Jobs__id`,
    Jobs.name AS `Jobs__name`,
    Jobs.media_id AS `Jobs__media_id`,
    Jobs.job_category_id AS `Jobs__job_category_id`,
    Jobs.job_type_id AS `Jobs__job_type_id`,
    Jobs.description AS `Jobs__description`,
    Jobs.detail AS `Jobs__detail`,
    Jobs.business_skill AS `Jobs__business_skill`,
    Jobs.knowledge AS `Jobs__knowledge`,
    Jobs.location AS `Jobs__location`,
    Jobs.activity AS `Jobs__activity`,
    Jobs.academic_degree_doctor AS `Jobs__academic_degree_doctor`,
    Jobs.academic_degree_master AS `Jobs__academic_degree_master`,
    Jobs.academic_degree_professional AS `Jobs__academic_degree_professional`,
    Jobs.academic_degree_bachelor AS `Jobs__academic_degree_bachelor`,
    Jobs.salary_statistic_group AS `Jobs__salary_statistic_group`,
    Jobs.salary_range_first_year AS `Jobs__salary_range_first_year`,
    Jobs.salary_range_average AS `Jobs__salary_range_average`,
    Jobs.salary_range_remarks AS `Jobs__salary_range_remarks`,
    Jobs.restriction AS `Jobs__restriction`,
    Jobs.estimated_total_workers AS `Jobs__estimated_total_workers`,
    Jobs.remarks AS `Jobs__remarks`,
    Jobs.url AS `Jobs__url`,
    Jobs.seo_description AS `Jobs__seo_description`,
    Jobs.seo_keywords AS `Jobs__seo_keywords`,
    Jobs.sort_order AS `Jobs__sort_order`,
    Jobs.publish_status AS `Jobs__publish_status`,
    Jobs.version AS `Jobs__version`,
    Jobs.created_by AS `Jobs__created_by`,
    Jobs.created AS `Jobs__created`,
    Jobs.modified AS `Jobs__modified`,
    Jobs.deleted AS `Jobs__deleted`,
    JobCategories.id AS `JobCategories__id`,
    JobCategories.name AS `JobCategories__name`,
    JobCategories.sort_order AS `JobCategories__sort_order`,
    JobCategories.created_by AS `JobCategories__created_by`,
    JobCategories.created AS `JobCategories__created`,
    JobCategories.modified AS `JobCategories__modified`,
    JobCategories.deleted AS `JobCategories__deleted`,
    JobTypes.id AS `JobTypes__id`,
    JobTypes.name AS `JobTypes__name`,
    JobTypes.job_category_id AS `JobTypes__job_category_id`,
    JobTypes.sort_order AS `JobTypes__sort_order`,
    JobTypes.created_by AS `JobTypes__created_by`,
    JobTypes.created AS `JobTypes__created`,
    JobTypes.modified AS `JobTypes__modified`,
    JobTypes.deleted AS `JobTypes__deleted`
FROM
    jobs Jobs
    LEFT JOIN jobs_personalities JobsPersonalities ON Jobs.id = (JobsPersonalities.job_id)
    LEFT JOIN personalities Personalities ON (Personalities.id = (JobsPersonalities.personality_id)
            AND(Personalities.deleted) IS NULL)
    LEFT JOIN jobs_practical_skills JobsPracticalSkills ON Jobs.id = (JobsPracticalSkills.job_id)
    LEFT JOIN practical_skills PracticalSkills ON (PracticalSkills.id = (JobsPracticalSkills.practical_skill_id)
            AND(PracticalSkills.deleted) IS NULL)
    LEFT JOIN jobs_basic_abilities JobsBasicAbilities ON Jobs.id = (JobsBasicAbilities.job_id)
    LEFT JOIN basic_abilities BasicAbilities ON (BasicAbilities.id = (JobsBasicAbilities.basic_ability_id)
            AND(BasicAbilities.deleted) IS NULL)
    LEFT JOIN jobs_tools JobsTools ON Jobs.id = (JobsTools.job_id)
    LEFT JOIN affiliates Tools ON (Tools.type = 1
            AND Tools.id = (JobsTools.affiliate_id)
            AND(Tools.deleted) IS NULL)
    LEFT JOIN jobs_career_paths JobsCareerPaths Page 3 / 4 ON Jobs.id = (JobsCareerPaths.job_id)
    LEFT JOIN affiliates CareerPaths ON (CareerPaths.type = 3
            AND CareerPaths.id = (JobsCareerPaths.affiliate_id)
            AND(CareerPaths.deleted) IS NULL)
    LEFT JOIN jobs_rec_qualifications JobsRecQualifications ON Jobs.id = (JobsRecQualifications.job_id)
    LEFT JOIN affiliates RecQualifications ON (RecQualifications.type = 2
            AND RecQualifications.id = (JobsRecQualifications.affiliate_id)
            AND(RecQualifications.deleted) IS NULL)
    LEFT JOIN jobs_req_qualifications JobsReqQualifications ON Jobs.id = (JobsReqQualifications.job_id)
    LEFT JOIN affiliates ReqQualifications ON (ReqQualifications.type = 2
            AND ReqQualifications.id = (JobsReqQualifications.affiliate_id)
            AND(ReqQualifications.deleted) IS NULL)
        INNER JOIN job_categories JobCategories ON (JobCategories.id = (Jobs.job_category_id)
                AND(JobCategories.deleted) IS NULL)
            INNER JOIN job_types JobTypes ON (JobTypes.id = (Jobs.job_type_id)
                    AND(JobTypes.deleted) IS NULL)
        WHERE ((JobCategories.name LIKE '%キャビンアテンダント%'
                OR JobTypes.name LIKE '%キャビンアテンダント%'
                OR Jobs.name LIKE '%キャビンアテンダント%'
                OR Jobs.description LIKE '%キャビンアテンダント%'
                OR Jobs.detail LIKE '%キャビンアテンダント%'
                OR Jobs.business_skill LIKE '%キャビンアテンダント%'
                OR Jobs.knowledge LIKE '%キャビンアテンダント%'
                OR Jobs.location LIKE '%キャビンアテンダント%'
                OR Jobs.activity LIKE '%キャビンアテンダント%'
                OR Jobs.salary_statistic_group LIKE '%キャビンアテンダント%'
                OR Jobs.salary_range_remarks LIKE '%キャビンアテンダント%'
                OR Jobs.restriction LIKE '%キャビンアテンダント%'
                OR Jobs.remarks LIKE '%キャビンアテンダント%'
                OR Personalities.name LIKE '%キャビンアテンダント%'
                OR PracticalSkills.name LIKE '%キャビンアテンダント%'
                OR BasicAbilities.name LIKE '%キャビンアテンダント%'
                OR Tools.name LIKE '%キャビンアテンダント%'
                OR CareerPaths.name LIKE '%キャビンアテンダント%'
                OR RecQualifications.name LIKE '%キャビンアテンダント%'
                OR ReqQualifications.name LIKE '%キャビンアテンダント%')
            AND publish_status = 1
            AND(Jobs.deleted) IS NULL)
    GROUP BY
        Jobs.id
    ORDER BY
        Jobs.sort_order DESC,
        Jobs.id DESC
    LIMIT 50 OFFSET 0

我知道这是一个很长的查询,但我必须优化这个没有其他选项,所以需要专业人士的指导谢谢

低效模式

                 OR  Jobs.restriction   LIKE '%キャビンアテンダント%'
                 OR  Jobs.remarks       LIKE '%キャビンアテンダント%'
                 OR  Personalities.name LIKE '%キャビンアテンダント%'

这是一种常见但非常低效的模式。

  • OR阻止使用索引
  • LIKE中的前导通配符阻止使用索引
  • 触及多个表的WHERE子句很痛。

可能的解决方法

我确实看到了可以转化为优化的模式。 您似乎正在根据大量列检查用户提供的字符串。 如果您可以使用FULLTEXT而不是使用LIKE ,那么有一个更快的解决方案。 (抱歉,我不知道日语是否可以与FULLTEXT一起使用;您可能需要 MySQL 8.0,它有很多 UTF-8 改进。)

这里的技术:

  1. 将所有这些搜索列(限制、备注、名称等)中的数据收集到一个列中,也许到一个新表中。
  2. FULLTEXT应用于该列。
  3. 仅在该列中搜索; 获取匹配的 id,然后JOIN所有其他表。

倒退

即使FULLTEXT不适用于亚洲语言,应用LIKE的单个字符串也会有所帮助。

语法错误?

 LEFT JOIN jobs_career_paths JobsCareerPaths Page 3 / 4 ON Jobs.id = (JobsCareerPaths.job_id)

看起来像语法错误。

需要复合索引

    LEFT JOIN  affiliates CareerPaths
          ON (CareerPaths.type = 3
         AND  CareerPaths.id = (JobsCareerPaths.affiliate_id)
         AND (CareerPaths.deleted) IS NULL

CareerPaths 需要这个复合索引:

INDEX(type, id, deleted)

以任何顺序排列列。 3 个单独的索引不太好。 (还要检查其他JOINs 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM