Как сократить время выполнения MySQL-запроса с 90 до менее 5 секунд или даже одной секунды

0

Я использую базу данных MySQL. Когда я выполняю запрос, который основная таблица (20 тысяч строк) соединяется с другими 5 таблицами, для возврата мне результата требуется 90 секунд. Затем я добавлял индексы в каждый из критериев (где предложение). Затем время выполнения уменьшается от 90 секунд до 45 секунд, а затем я пытаюсь выбрать только нужные поля вместо всех (*), это занимает 25 секунд. Что я должен сделать, чтобы оно упало до менее 5 секунд или даже секунды?

SELECT
ap.propertyid, ap.type_market, 
ap.market_sale_price, ap.sale_from, ap.sale_until, ap.property_salepsf, 
ap.rent_from, ap.property_rent_until, ap.property_rentpsf, ap.title, 
ap.street, ap.suburbs, ap.state, ap.bedrooms, ap.bathrooms, ap.carport, 
ap.buildup_area, ap.builtup_area_from, ap.builtup_area_to, 
ap.land_area, ap.land_area_from, ap.land_area_to, 
ap.status AS prop_status, ap.datecreate AS uploadedOn, type_property.name, (
 SELECT name 
 FROM gallery 
 WHERE
 propertyid = ap.propertyid
 ORDER BY frontpage
 LIMIT 0, 1
) AS picture, 
uom_mst.uom_shortcode,
agent_profile.person, agent_profile.mobile, agent_profile.electronicmail, agent_profile.agent_pix, agent_profile.agent_pix_crop,
country.country_currency_html AS currency,
owner_profile.oname, owner_profile.omobile, owner_profile.oemail
FROM agentproperty ap
LEFT JOIN agent_profile ON (ap.agentid = agent_profile.agentid)
LEFT JOIN type_property ON (ap.type_property = type_property.rid)
LEFT JOIN uom_mst ON (ap.property_bua_uom = uom_mst.uom_id)
LEFT JOIN country ON (ap.property_ctry = country.country_id)
LEFT JOIN owner_profile ON (ap.propertyid = owner_profile.propertyid)
WHERE
ap.status = 'active' AND 
agent_profile.status = 'active' AND 
ap.property_type = '1' AND 
getCompanyID(ap.propertyid) = '001' AND 
ap.agentid = '100010001'
GROUP BY ap.propertyid
ORDER BY ap.datecreate DESC
LIMIT 200, 10
  • 0
    кеширую мою скорость. не очень хороший ответ, но это очень большой запрос
Теги:
performance
join

2 ответа

3
Лучший ответ

Запустите EXPLAIN PLAN по вашему запросу и посмотрите, что говорит об этом MySQL.

Убедитесь, что все столбцы, участвующие в JOIN, имеют связанные с ними индексы.

Шесть таблиц в JOIN - это большая работа для базы данных. Я бы порекомендовал посмотреть, не повлияет ли переупорядочение JOINs. Если вы заказываете JOINs с самых ограничительных по крайней мере, вы можете сократить необходимую работу.

1

Предполагая высокую избирательность с agentid и propertyid (agent_property, agent_profile) и низкими избирательностью для status, property_types, country_id и т.д.) [это означает, что существует много разных агентов и свойств, но несколько разных состояний, тип свойства и т.д.]

ИМХО индексы с наибольшим ударом будут:

  • agent_property(agentid) или agent_property(agentid, property_type, status) - используется в разделе where where
  • agent_profile(agentid) - используется в соединениях
  • owner_profile(propertyid)

Однако вам также нужно будет рассмотреть влияние getCompanyId Вы не предоставили SQL, но ему, вероятно, понадобится хотя бы индекс property(property_id) или любой другой таблицы свойств.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню