mysql запрос занимает много времени - PullRequest
0 голосов
/ 15 марта 2020

Я хочу оптимизировать этот запрос, потому что для возврата записей требуется много времени

SELECT 
    u.*, 
    s.legal_name AS structure_name, 
    ui.id AS userinfo_id, 
    ui.structure_id AS structure_id, 
    ui.lrn_user, 
    ui.gender, 
    ui.fiscal_code, 
    ui.prov, 
    ui.phone, 
    ui.school_name, 
    ui.school_codice_meccanografico, 
    us.status, us.date AS status_date, 
    CONCAT(u.lastname,' ',u.firstname) AS fullname, 
    CONCAT(u.firstname,' ',u.lastname) AS display_name, 
    uu.username AS created_by_name, 
    g.group_names, 
    IF(u.website_id = 0,'Sito Web principale', w.name) AS website_name 
FROM fcf_users AS u 
LEFT JOIN ( 
    SELECT 
        gu.user_id, 
        GROUP_CONCAT(gg.name SEPARATOR ', ') AS group_names 
    FROM fcf_user_user_groups gu 
    JOIN fcf_user_groups gg ON gg.id = gu.group_id 
    GROUP BY user_id 
) g ON g.user_id = u.id 
LEFT JOIN fcf_users_userinfo AS ui ON ui.user_id = u.id 
LEFT JOIN fcf_users_user_statuses AS us ON us.user_id = u.id 
LEFT JOIN fcf_structures_structures AS s ON s.id = ui.structure_id 
LEFT JOIN fcf_users AS uu ON uu.id = u.created_by 
LEFT JOIN fcf_websites AS w ON w.id = u.website_id 
WHERE 
    u.id IN (SELECT user_id FROM fcf_user_user_groups WHERE group_id = '8') 
    AND u.id IN (SELECT user_id FROM fcf_user_user_groups WHERE group_id = '8') 
    AND ui.lrn_user = '0' 
ORDER BY fullname ASC 
LIMIT 0,25

Если кто-то может помочь, спасибо

1 Ответ

0 голосов
/ 15 марта 2020

Выверните его наизнанку. То есть first использует «производную» таблицу, чтобы найти 25 пользователей, которых вы хотите. Затем собирает остальную информацию.

То, что у вас есть, собирает всю информацию (включая всю JOIN работу) для всех пользователей, затем сортирует и снимает 25.

Это будет что-то вроде:

SELECT  -- lots of stuff
    FROM ( SELECT  u.id,
                   CONCAT(u.lastname,' ',u.firstname) AS fullname
              FROM  fcf_users AS u
              JOIN  fcf_user_user_groups AS ug ON ...
              JOIN  fcf_users_userinfo AS ui ON ui.user_id = u.id
              WHERE  ug.group_id = '8'
                AND  ui.lrn_user = '0'
              ORDER BY u.lastname, u.firstname  -- now sargeable
              LIMIT 25
         ) AS u25
    JOIN ....  -- whatever tables are needed to get the rest of the columns
    ORDER BY u25.fullname  -- yes, again, but now using the CONCAT
    -- no limit here

Также:

u:  INDEX(lastname, firstname, id)

user_user_group is "many-t0 = много картографического "стола"? Если это так, следуйте советам по индексированию здесь: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table То же самое для многих других: много таблиц.

Обратите внимание, как я помещаю в производную таблицу только таблицы, необходимые для достижения LIMIT.

...