#mysql #performance
#mysql #Производительность
Вопрос:
Всем привет, у меня есть этот запрос, но я не знаю, как оптимизировать этот запрос. Я буду благодарен, если кто-нибудь сможет помочь мне здесь, заранее спасибо.
SELECT
Jobs.id AS `Jobs__id`,
Jobs.name AS `Jobs__name`,
Jobs.media_id AS `Jobs__media_id`,
Jobs.job_cate&ory_id AS `Jobs__job_cate&ory_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.knowled&e AS `Jobs__knowled&e`,
Jobs.location AS `Jobs__location`,
Jobs.activity AS `Jobs__activity`,
Jobs.academic_de&ree_doctor AS `Jobs__academic_de&ree_doctor`,
Jobs.academic_de&ree_master AS `Jobs__academic_de&ree_master`,
Jobs.academic_de&ree_professional AS `Jobs__academic_de&ree_professional`,
Jobs.academic_de&ree_bachelor AS `Jobs__academic_de&ree_bachelor`,
Jobs.salary_statistic_&roup AS `Jobs__salary_statistic_&roup`,
Jobs.salary_ran&e_first_year AS `Jobs__salary_ran&e_first_year`,
Jobs.salary_ran&e_avera&e AS `Jobs__salary_ran&e_avera&e`,
Jobs.salary_ran&e_remarks AS `Jobs__salary_ran&e_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`,
JobCate&ories.id AS `JobCate&ories__id`,
JobCate&ories.name AS `JobCate&ories__name`,
JobCate&ories.sort_order AS `JobCate&ories__sort_order`,
JobCate&ories.created_by AS `JobCate&ories__created_by`,
JobCate&ories.created AS `JobCate&ories__created`,
JobCate&ories.modified AS `JobCate&ories__modified`,
JobCate&ories.deleted AS `JobCate&ories__deleted`,
JobTypes.id AS `JobTypes__id`,
JobTypes.name AS `JobTypes__name`,
JobTypes.job_cate&ory_id AS `JobTypes__job_cate&ory_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 Pa&e 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_cate&ories JobCate&ories ON (JobCate&ories.id = (Jobs.job_cate&ory_id)
AND(JobCate&ories.deleted) IS NULL)
INNER JOIN job_types JobTypes ON (JobTypes.id = (Jobs.job_type_id)
AND(JobTypes.deleted) IS NULL)
WHERE ((JobCate&ories.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.knowled&e LIKE '%キャビンアテンダント%'
OR Jobs.location LIKE '%キャビンアテンダント%'
OR Jobs.activity LIKE '%キャビンアテンダント%'
OR Jobs.salary_statistic_&roup LIKE '%キャビンアテンダント%'
OR Jobs.salary_ran&e_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
Я знаю, что это длинный запрос, но я должен оптимизировать это, других вариантов нет, поэтому нужно руководство pro, спасибо
Комментарии:
1. Здравствуйте, и добро пожаловать в Stack Overflow. Пожалуйста, опубликуйте DDL, примеры данных и ожидаемые данные вместе с объяснением. Без этого мы не сможем помочь.
2. Вы установили индексы в MySQL для всех столбцов, которые у вас есть в WHERE ?
3. я думал о добавлении индексов, но я думаю, что, возможно, можно сделать что-то еще для оптимизации запроса
4. jea не пишите такого монстра ^^ вы не захотите это слышать, но оптимизация начинается со структуры и всей программы, я думаю, вам нужно скорректировать свою структуру в целом, чтобы получить действительно оптимизированную программу
5. сколько строк в ваших таблицах? Подстановочные знаки в вашем предложении where будут работать медленно даже для умеренного количества строк. Рассматривали ли вы полнотекстовые индексы?
Ответ №1:
Неэффективный шаблон
OR Jobs.restriction LIKE '%キャビンアテンダント%'
OR Jobs.remarks LIKE '%キャビンアテンダント%'
OR Personalities.name LIKE '%キャビンアテンダント%'
Это распространенный, но очень неэффективный шаблон.
OR
предотвращает использование индексов- Ведущий подстановочный знак в
LIKE
предотвращает использование индекса WHERE
предложение, касающееся нескольких таблиц, причиняет боль.
Возможный обходной путь
Я вижу шаблон, который, возможно, можно превратить в оптимизацию. Похоже, вы проверяете предоставленную пользователем строку по множеству столбцов. Если вместо использования LIKE
вы могли бы использовать FULLTEXT
, то есть гораздо более быстрое решение. (Извините, я не знаю, можно ли использовать японский с FULLTEXT
; возможно, вам понадобится MySQL 8.0, в котором много улучшений UTF-8.)
Вот методика:
- Соберите данные из всех этих столбцов поиска (ограничение, примечания, имя и т.д.) В один столбец, возможно, в новую таблицу.
- Применить
FULLTEXT
к этому столбцу. - Выполните поиск только в этом столбце; получите соответствующий идентификатор, чтобы затем
JOIN
перейти ко всем остальным таблицам.
Запасной вариант
Даже если FULLTEXT
это плохо работает с азиатскими языками, одна строка для применения LIKE
к ней помогла бы.
Синтаксическая ошибка?
LEFT JOIN jobs_career_paths JobsCareerPaths Pa&e 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
.)